2011-01-08 2 views
5
У

возникла следующая проблема:Как создать загрузку файла в grails, который работает с oracle?

Я попытался создать функциональность загрузки файла simpel в grails. Я только что создал класс домена с

byte[] rawFile 

как собственность. Для меня Грейлс оставил для меня все остальное. Он отлично работал для стандартного hsqldb в среде dev.

Затем я развернул его на сервере с установленным оракулом db (тонким драйвером). Все, кроме загрузки файлов, отлично работает с oracle db. Для загрузки файла, я получаю (насколько я помню)

SQLException: ORA-01461: может связать LONG значение только для вставки в LONG

Я попробовал несколько способов исправить он (включая некоторые сопоставления столбцов с блобами и использование java.sql.blob вместо байта []), но ничего действительно не сработало, и я пошел в направлении, где мой код больше не будет db.

Google на самом деле не помог мне, и мои книги с граалями тоже не помогают.

Сохранение файла на диск не является хорошим решением в моем мнении.

Так вот мой вопрос:

как создать загрузку файлов в Grails, который работает с оракулом?

Обновление: дополнительная информация. Управляется воспроизведением проблемы с XE-версией Oracle:

Hibernate создает столбец VARBINARY (255) для rawFile. Поэтому я попытался загрузить файл размером 4 байта, и он сработал.

Затем я изменил тип столбца вручную на «blob», и он работал с большими файлами.

Затем я добавил

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

в мой класс домена и он перестал работать:

ОШИБКА errors.GrailsExceptionResolver - [B не может быть приведен к java.sql.Blob java.lang. ClassCastException: [в не может быть приведен к java.sql.Blob

:-(

ответ

4

Вместо установки типа для больших двоичных объектов попытаться увеличить MaxSize ограничение:

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

Отлично! Кажется, это сделал трюк! – rdmueller

+0

Так что это не решение! У меня такая проблема, и если я не устанавливаю тип поля в blob, в базе данных oracle тип поля устанавливается как LONG. Интересно, как этот ответ можно считать правильным и хорошим решением. :) – emilan

1

Я не уверен, что вы делаете в вашем контроллере, попробуйте сделать это вручную, чтобы увидеть, что происходит:

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

хорошая идея, но nope - не решает проблему. – rdmueller

4

Если вы хотите использовать поле Blob в Oracle, тогда установите для свойства домена значение byte [] и установите тип org.hibernate.type.MaterializedBlobType.MaterializedBlobType обрабатывает преобразование между Oracle (предположительно другими базами данных, но я делал это только на Oracle) и байт [].

byte[] blobFile 

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

работает и на постгре, спасибо! –

1

Попробуйте установить sqlType.

Используя поле домена с типом byte[] с sqlType набором для "blob" в mapping блок работает для меня с помощью Grails 2.3.1 и Oracle 11g. Grails автоматически обрабатывает преобразование типов.

class Image { 
    byte[] image 
    static mapping = { 
     image(sqlType: "blob") 
    } 
} 
Смежные вопросы