2011-01-08 13 views
5

tiene el siguiente problema:¿Cómo creo una carga de archivo en griales que funciona con Oracle?

Intenté 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 oráculo db configurado (controlador delgado). Todo menos la carga del archivo funciona bien con el oráculo db. Para la carga de archivos me sale un (por lo que yo puedo recordar)

excepción de SQL: ORA-01461: se puede unir un valor LONG sólo para inserción en un largo

He intentado varias maneras de solucionar (incluyendo algunos mapeos de columnas a blobs y usando java.sql.blob en lugar de byte []) pero nada funcionó realmente y fui en una dirección donde mi código ya no sería independiente de db.

Google no me ayudó realmente 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í es mi pregunta:

cómo puedo crear un archivo de carga en griales que funciona con Oracle?

actualización: Tiene algunas informaciones adicionales. Se las arregló para reproducir el problema con la Edición XE de Oracle:

Hibernate crea una columna VARBINARIA (255) para el archivo raw. Así que traté de subir un archivo de 4 bytes y funcionó.

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

Luego añade

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

a mi clase de dominio y que dejó de funcionar: errors.GrailsExceptionResolver

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

:-(

Respuesta

4

En lugar de establecer el tipo de Blob tratar de aumentar la restricción maxSize:

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

¡Genial! Parece que hizo el truco! – rdmueller

+0

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

1

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

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

buena idea, pero no - no resuelve el problema. – rdmueller

4

Si desea utilizar 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 
} 
+0

funciona para postgres también, gracias! –

1

Intente configurar la sqlType.

El uso de un campo de dominio con el tipo byte[] con sqlType conjunto de "blob" en las obras de bloque mapping 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") 
    } 
} 
Cuestiones relacionadas