Klasse werfen Ausnahme in Groovy
-
16-09-2019 - |
Frage
Ich möchte ein Bild hochladen groovigem auf Grails verwenden. Meine gsp Seite ist wie folgt (ich eine vereinfachte Version des Original-bin zeigt)
<g:form controller="post" action="save" enctype="multipart/form-data">
My picture <input type="file" name="myPicture" />
<g:submitButton name="submit" value="Save"/>
</g:form>
Meine Domain-Klasse ist wie folgt:
class Post {
byte[] myPicture
static mapping = {
myPicture type: "blob"
}
Ich brauche diese Zuordnung sonst wird MySql eine smallblob schaffen, die zu klein ist, um die Bilder zu passen
static constraints = {
myPicture(nullable:false)
}
}
Bei der Steuerung Ich habe eine Aktion aufgerufen speichern, die wie folgt lautet:
def save = {
def post = loadPost(params.id)
post.properties = params
if(post.save()) {
print "hallo world"
redirect(action:'list', params:params)
} else {
render(view:'edit', model:[post:post])
}
}
Die Ausnahme wird ausgelöst, wenn ich versuche, das Bild in der DB zu speichern.
2009-04-27 18:16:07,319 [20806951@qtp0-0] ERROR errors.GrailsExceptionResolver - java.lang.ClassCastException: [B cannot be cast to java.sql.Blob
org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.ClassCastException: [B kann nicht auf java.sql.Blob gegossen werden
Jeder Hinweis, warum ist denn das?
BTW, habe ich in einem Tutorial gesehen, die Bilder als Strings behandelt wurden, aber es hat nicht funktioniert als auch.
Lösung
versuchen, auf diese Weise:
def save = {
def post = loadPost(params.id)
def f = request.getFile('myPicture')
post.myPicture = f.getBytes()
post.pictureType = f.getContentType()
if(post.save()) {
Andere Tipps
fand ich eine ähnliche Frage auf Nabble:
http://www.nabble.com/MySQL-and-Blobs -td16116885.html
Zwei mögliche Lösungen werden vorgeschlagen:
- ändern Sie die Einschränkungen der Blobs Eigenschaft zu einer großen Max-Größe, um es zu stoppen verwenden „TINYBLOB“.
- Verwenden Sie die Hibernate Blob Implementierung statt byte [] für die Typdeklaration Eigentum. Dies erfordert, dass Sie Daten in die BLOB-Stream, statt direkter Zuordnung, aber die Post oben gibt Code so zu tun.
können Sie versuchen, Spring docs :
def upload = {
def f = request.getFile('myFile')
if(!f.empty) {
f.transferTo( new File('/some/local/dir/myfile.txt') )
response.sendError(200,'Done');
}
else {
flash.message = 'file cannot be empty'
render(view:'uploadForm')
}
}
Ich glaube, Sie f.bytes
direkt zugreifen können.