Classe gettato un'eccezione in Groovy
-
16-09-2019 - |
Domanda
Voglio caricare un'immagine utilizzando un groove su Grails. La mia pagina di SPG è la seguente (sto mostrando una versione semplificata di quella originale)
<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>
La mia classe di dominio è il seguente:
class Post {
byte[] myPicture
static mapping = {
myPicture type: "blob"
}
Ho bisogno di questa mappatura altrimenti MySql creerà una smallblob, che è di piccole dimensioni per adattarsi alle immagini
static constraints = {
myPicture(nullable:false)
}
}
Dal controller ho un'azione chiamata salvataggio che è il seguente:
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])
}
}
L'eccezione viene generata quando si tenta di salvare l'immagine al DB.
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 non può essere lanciato a java.sql.Blob
Qualsiasi suggerimento perché è questo?
A proposito, ho visto in un tutorial che le immagini sono state gestite come stringhe, ma non ha funzionato pure.
Soluzione
provare in questo modo:
def save = {
def post = loadPost(params.id)
def f = request.getFile('myPicture')
post.myPicture = f.getBytes()
post.pictureType = f.getContentType()
if(post.save()) {
Altri suggerimenti
Ho trovato una domanda simile su Nabble:
http://www.nabble.com/MySQL-and-Blobs -td16116885.html
Due possibili soluzioni sono proposte:
- Cambiare i vincoli della proprietà blob ad una grande max-size, per impedirgli di usare "TINYBLOB".
- Utilizzare l'attuazione Hibernate Blob invece di byte [] per la dichiarazione il tipo della proprietà. Ciò richiederà lo streaming dati nel Blob, invece di assegnazione diretta, ma il post di cui sopra dà il codice per farlo.
Si può provare a utilizzare di Primavera MultipartFile all'interno del vostro metodo di loadPost()
?
Ecco un esempio dalla 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')
}
}
Credo che si può accedere direttamente f.bytes
.