遇到以下问题:
我尝试在grails中创建一个simpel文件上传功能。我刚刚用
创建了一个域类byte[] rawFile
作为财产。 Grails为我做了大部分休息。它适用于开发环境中的标准hsqldb。
然后我将其部署到服务器并配置了oracle db(瘦驱动程序)。除了文件上传之外的所有内容都可以与oracle db一起使用。对于文件上传,我得到了一个(据我所知)
SQLException:ORA-01461:只能插入LONG值才能插入LONG
我尝试了几种方法来解决它(包括blob的一些列映射和使用java.sql.blob而不是byte [])但是没有真正起作用,我走的是我的代码不再是db独立的方向。
Google并没有真正帮助我,我的Grails书籍也没有帮助。
我认为将文件保存到磁盘不是一个好的解决方案。
所以这是我的问题:
如何在与oracle一起使用的grails中创建文件上传?
更新:获得了一些额外的信息。管理以使用XE-Edition of Oracle重现问题:
Hibernate为rawFile创建一个VARBINARY(255)列。所以我尝试上传一个4字节的文件,但它确实有效。
然后我手动将列的类型更改为'blob',它可以处理更大的文件。
然后我添加了
static mapping = {
columns {
rawFile type:'blob'
}
}
到我的域类,它停止了工作:
ERROR errors.GrailsExceptionResolver - [B不能转换为java.sql.Blob java.lang.ClassCastException:[B不能转换为java.sql.Blob
: - (
答案 0 :(得分:4)
不要将类型设置为blob,而是尝试增加maxSize约束:
static constraints = {
rawFile(maxSize: 20 * 1024 * 1024) // 20 MBs
// ...
}
答案 1 :(得分:4)
如果要在Oracle中使用Blob字段,请将domain属性设置为byte [],并将类型设置为org.hibernate.type.MaterializedBlobType。 MaterializedBlobType处理Oracle之间来回转换(可能是其他数据库,但我只在Oracle上完成此操作)和byte []。
byte[] blobFile
static mapping = {
blobFile type: org.hibernate.type.MaterializedBlobType
}
答案 2 :(得分:1)
我不确定你在控制器中做了什么,尝试手动做看看会发生什么:
request.fileMap.each { name, file ->
if (!file.empty) {
model.rawFile = file.bytes
}
}
model.save()
答案 3 :(得分:1)
尝试设置sqlType
。
在byte[]
块中使用类型为sqlType
且"blob"
设置为mapping
的域字段,可以使用Grails 2.3.1和Oracle 11g。 Grails会自动处理类型转换。
class Image {
byte[] image
static mapping = {
image(sqlType: "blob")
}
}