Clase fundido excepción en Groovy
-
16-09-2019 - |
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.
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 sugierendos 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
.