如何在与oracle一起使用的grails中创建文件上载?

时间:2011-01-08 19:53:31

标签: oracle hibernate grails

遇到以下问题:

我尝试在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

: - (

4 个答案:

答案 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")
    }
}