Pregunta

Quiero subir una imagen usando un maravilloso en griales. Mi página GSP es el siguiente (estoy mostrando una versión simplificada del original)

<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>

Mi clase de dominio es el siguiente:

class Post {    

byte[] myPicture

static mapping = {
    myPicture type:  "blob" 
}

Necesito este mapeo de lo contrario MySQL creará un smallblob que es al pequeño como para caber las imágenes

static constraints = {
    myPicture(nullable:false)      
}

}

En el controlador tengo una acción llamada parada que es como sigue:

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])
    }
}

La excepción se produce cuando trato de guardar la imagen en la base de datos.

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 no se puede convertir a java.sql.Blob

Cualquier indicio por qué es esto?

Por cierto, que he visto en un tutorial que las imágenes han sido manipulados como cadenas, pero no funcionó también.

¿Fue útil?

Solución

tratar de esta manera:

  def save = {                               

    def post = loadPost(params.id)

    def f = request.getFile('myPicture')             

    post.myPicture = f.getBytes()
    post.pictureType = f.getContentType()                    


    if(post.save()) {

Otros consejos

He encontrado una pregunta similar sobre Nabble:

http://www.nabble.com/MySQL-and-Blobs -td16116885.html

Se sugieren

dos soluciones posibles:

  • Cambiar las limitaciones de la propiedad blob en gran max-size, para que deje de usar "TINYBLOB".
  • Use la aplicación Hibernate Blob en lugar de byte [] para la declaración de tipo de la propiedad. Para ello será necesario transmitir datos en el Blob, en lugar de asignación directa, pero el post anterior da el código para hacerlo.

Se puede tratar usando de primavera MultipartFile dentro de su método loadPost()?

Aquí está un ejemplo de la 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')
    }
}

Creo que se puede acceder directamente f.bytes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top