Как создать загрузку файла в Grails, который работает с Oracle? - PullRequest
5 голосов
/ 08 января 2011

возникла следующая проблема:

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

byte[] rawFile

как собственность. Grails сделал большую часть отдыха для меня. Он работал нормально для стандартного hsqldb в среде разработки.

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

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

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

Google действительно не помог мне, и мои книги Grails тоже не помогают.

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

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

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

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

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

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

Я тогда добавил

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

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

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

: - (

Ответы [ 4 ]

4 голосов
/ 10 января 2011

Вместо установки типа blob попытайтесь увеличить ограничение maxSize:

static constraints = {
    rawFile(maxSize: 20 * 1024 * 1024) // 20 MBs
    // ...
}
4 голосов
/ 12 сентября 2013

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

byte[] blobFile

static mapping = {
    blobFile type: org.hibernate.type.MaterializedBlobType
}
1 голос
/ 01 сентября 2014

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

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

class Image {
    byte[] image
    static mapping = {
        image(sqlType: "blob")
    }
}
1 голос
/ 08 января 2011

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

request.fileMap.each { name, file ->
    if (!file.empty) {
        model.rawFile = file.bytes
    }
}
model.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...