Classe jeté exception dans Groovy
-
16-09-2019 - |
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.
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
.