Question

Je veux télécharger une image en utilisant un Groovy on Grails. Ma page gsp est la suivante (je montre une version simplifiée de l'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>

Ma classe de domaine est la suivante:

class Post {    

byte[] myPicture

static mapping = {
    myPicture type:  "blob" 
}

J'ai besoin de cette cartographie autrement MySql va créer une smallblob qui est petite pour les images

static constraints = {
    myPicture(nullable:false)      
}

}

Au contrôleur, j'ai une action appelée sauvegarde qui est comme suit:

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'exception est levée lorsque je tente de sauver l'image au 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 ne peut pas être jeté à java.sql.Blob

Toute velléité pourquoi est-ce?

BTW, j'ai vu dans un tutoriel que les images ont été traitées comme des chaînes, mais cela n'a pas fonctionné ainsi.

Était-ce utile?

La solution

essayez de cette façon:

  def save = {                               

    def post = loadPost(params.id)

    def f = request.getFile('myPicture')             

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


    if(post.save()) {

Autres conseils

J'ai trouvé une question similaire sur Nabble:

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

Deux solutions possibles sont proposées:

  • Modifier les contraintes de la propriété blob à une grande taille maximale, pour l'arrêter d'utiliser « TINYBLOB ».
  • Utiliser la mise en œuvre Hibernate Blob au lieu d'octet [] pour la déclaration de type de la propriété. Cela vous besoin de flux de données dans le Blob, au lieu d'affectation directe, mais le poste ci-dessus donne le code pour le faire.

Pouvez-vous essayer d'utiliser 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')
    }
}

Je crois que vous pouvez accéder directement à f.bytes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top