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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top