¿Cómo creo una carga de archivo en Grails que funciona con Oracle?

tiene el siguiente problema:

Traté de crear una funcionalidad de carga de archivos simpel en Grails. Acabo de crear una clase de dominio con un

byte[] rawFile

como propiedad. Grails hizo la mayor parte del resto por mí. Funcionó bien para el hsqldb estándar en el entorno de desarrollo.

Luego lo implementé en el servidor con una base de datos de Oracle configurada (controlador delgado). Todo menos la carga de archivos funciona bien con Oracle db. Para la carga del archivo obtengo un (por lo que puedo recordar)

SQLException: ORA-01461: puede enlazar un valor LONG solo para insertarlo en un LONG

Intenté varias formas de solucionarlo (incluidas algunas asignaciones de columnas a blobs y el uso de java.sql.blob en lugar de byte []) pero nada realmente funcionó y fui en una dirección en la que mi código ya no sería independiente de db.

Google realmente no me ayudó y mis libros de Grails tampoco ayudan.

Guardar el archivo en el disco no es una buena solución en mi opinión.

Así que aquí está mi pregunta:

¿Cómo creo una carga de archivo en Grails que funciona con Oracle?

Noticias: obtuve información adicional. Se las arregló para reproducir el problema con la XE-Edition de Oracle:

Hibernate crea una columna VARBINARY (255) para el archivo rawFile. Así que intenté cargar un archivo de 4 bytes y funcionó.

Luego cambié el tipo de columna manualmente a 'blob' y funcionó con archivos más grandes.

Luego agregué

static mapping = {
    columns {
        rawFile type:'blob'
    }
}

a mi clase de dominio y dejó de funcionar:

ERROR errors.GrailsExceptionResolver - [B no se puede convertir a java.sql.Blob java.lang.ClassCastException: [B no se puede convertir a java.sql.Blob

:-(

preguntado el 08 de enero de 11 a las 19:01

4 Respuestas

En lugar de establecer el tipo en blob, intente aumentar la restricción maxSize:

static constraints = {
    rawFile(maxSize: 20 * 1024 * 1024) // 20 MBs
    // ...
}

Respondido el 10 de enero de 11 a las 12:01

¡Estupendo! ¡Parece que hizo el truco! - rdmueller

¡Entonces no es una solución! Tengo ese tipo de problema y si no configuro el tipo de campo en blob, en la base de datos de Oracle, el tipo de campo se establece como LARGO. Me pregunto cómo se puede considerar que esta respuesta es la correcta y una buena solución. :) - emilan

Si desea utilizar un campo Blob en Oracle, establezca la propiedad de su dominio en byte [] y establezca el tipo en org.hibernate.type.MaterializedBlobType. MaterializedBlobType maneja la conversión de un lado a otro entre Oracle (presumiblemente otras bases de datos, pero solo he hecho esto en Oracle) y el byte [].

byte[] blobFile

static mapping = {
    blobFile type: org.hibernate.type.MaterializedBlobType
}

Respondido el 12 de Septiembre de 13 a las 02:09

No estoy seguro de lo que está haciendo en su controlador, intente hacerlo manualmente para ver qué sucede:

request.fileMap.each { name, file ->
    if (!file.empty) {
        model.rawFile = file.bytes
    }
}
model.save()

Respondido el 08 de enero de 11 a las 23:01

Intente configurar el sqlType.

Usando un campo de dominio con tipo byte[] es sqlType establecido en "blob" en el objeto mapping block funciona para mí usando Grails 2.3.1 y Oracle 11g. Grails maneja la conversión de tipos automáticamente.

class Image {
    byte[] image
    static mapping = {
        image(sqlType: "blob")
    }
}

Respondido el 01 de Septiembre de 14 a las 22:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.