2009-04-27 7 views
1

Je veux télécharger une image en utilisant un groovy sur les grails. Ma page gsp est la suivante (je montre une version simplifiée de l'original)Exception de coulée de classe dans Groovy

<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 comme suit:

class Post {  

byte[] myPicture 

static mapping = { 
    myPicture type: "blob" 
} 

je besoin de cette cartographie autrement MySql va créer une smallblob qui est petite pour adapter les images

static constraints = { 
    myPicture(nullable:false)  
} 

} 

au contrôleur, j'ai une action appelée sauvegarde qui est la suivante:

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 j'essaie de sauvegarder l'image sur la base de données.

2009-04-27 18:16:07,319 [[email protected]] 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é aussi .

+0

Qu'est-ce que votre méthode loadPost() faire? –

+0

Rien de spécial private loadPost (id) { def post = new Post(); if (id) { post = Post.get (id) } post retour } – Luixv

+0

@Miguel Ping a fourni un morceau de code qui est correct pour le téléchargement, mais ne résout pas le casting de classe Exception. pour "sauvegarder" l'image, la méthode getBytes() doit être utilisée – Luixv

Répondre

1

essayer 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()) { 
2

J'ai trouvé une question similaire sur Nabble:

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

Deux solutions possibles sont proposées:

  • Modifiez les contraintes de la propriété blob à une grande taille maximale, pour l'arrêter d'utiliser "TinyBlob".
  • Utilisez l'implémentation Hibernate Blob au lieu de byte [] pour la déclaration de type de la propriété. Cela nécessitera que vous diffusiez des données dans le Blob, au lieu de l'assignation directe, mais le message ci-dessus donne le code pour le faire.
+0

Merci. Ceci est la solution pour l'exception de la classe – Luixv

2

Pouvez-vous essayer d'utiliser MultipartFile de Spring dans votre méthode loadPost()?

Voici un exemple 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') 
    } 
} 

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

+0

Merci pour vos conseils. getBytes() doit être utilisé.de toute façon cela ne résout pas le ClassCastException. Pour résoudre ce problème, voir @Bill James answer – Luixv

+0

En note, je pense que f.bytes équivaut à f.getBytes(), puisque groovy envoie l'accès à la propriété getter. –

+0

Merci encore. Je vais le tester. Je pensais avoir essayé mais j'ai eu une exception. Voyons voir. – Luixv