sp2 - ¿Cómo creo una carga de archivo en Grails que funciona con Oracle?
importar.sql a oracle (4)
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()
tiene el siguiente problema:
Traté de crear una funcionalidad de carga de archivos simpel en griales. Acabo de crear una clase de dominio con un
byte[] rawFile
como propiedad. Grails hizo la mayor parte del resto para mí. Funcionó bien para el estándar hsqldb en el entorno de desarrollo.
Luego lo implementé en el servidor con un Oracle DB configurado (controlador delgado). Todo menos la carga del archivo funciona bien con el oráculo db. Para la carga de archivos obtengo un (por lo que puedo recordar)
SQLException: ORA-01461: puede enlazar un valor LONG solo para insertarse en LONG
Intenté varias maneras de solucionarlo (incluidos algunos mapas de columnas a blobs y el uso de java.sql.blob en lugar de byte []) pero nada funcionó realmente 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?
Actualización : obtuvo algunas informaciones adicionales. Logré reproducir el problema con la edición XE de Oracle:
Hibernate crea una columna VARBINARIA (255) para rawFile. Así que traté de subir 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
:-(
En lugar de establecer el tipo para blob, intente aumentar la restricción maxSize:
static constraints = {
rawFile(maxSize: 20 * 1024 * 1024) // 20 MBs
// ...
}
Si desea usar un campo Blob en Oracle, establezca la propiedad del dominio en byte [] y establezca el tipo en org.hibernate.type.MaterializedBlobType. MaterializedBlobType maneja la conversión de ida y vuelta entre Oracle (presumiblemente otras bases de datos, pero solo he hecho esto en Oracle) y byte [].
byte[] blobFile
static mapping = {
blobFile type: org.hibernate.type.MaterializedBlobType
}
Intenta establecer el sqlType
.
Usar un campo de dominio con tipo byte[]
con sqlType
establecido en "blob"
en el bloque de mapping
funciona para mí usando Grails 2.3.1 y Oracle 11g. Grails maneja la conversión de tipo automáticamente.
class Image {
byte[] image
static mapping = {
image(sqlType: "blob")
}
}