2011-01-08 61 views
5

得到了以下問題:如何在Grails中使用Oracle創建文件上傳?

我試圖在grails中創建一個simpel文件上傳功能。我剛剛創建了一個域名類,其中包含一個

byte[] rawFile 

作爲屬性。 Grails爲我做了大部分休息。它在開發環境中適用於標準hsqldb。

然後我將它部署到配置了oracle db(瘦驅動程序)的服務器上。除了文件上傳以外,其他所有的東西都可以很好的與oracle db配合使用對於文件上傳我得到了(據我記得)

的SQLException:ORA-01461:只能用於插入綁定一個LONG值到LONG

我嘗試了幾種方法來解決它(包括一些blob的列映射和使用java.sql.blob而不是byte []),但沒有任何真正的工作,我走了一個方向,我的代碼不會再獨立於數據庫。

谷歌並沒有真正幫助我,我的聖書也沒有幫助。

保存文件到磁盤並不是一個好的解決方案,我認爲。

因此,這裏是我的問題:

如何創建在與甲骨文工作Grails的文件上傳?

更新:獲得了一些額外的信息。用Oracle的XE版本管理重現問題:

Hibernate爲rawFile創建一個VARBINARY(255)列。所以我試圖上傳一個4字節的文件,它的工作。

然後,我手動將該列的類型更改爲「blob」,並使用更大的文件。

我加入

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

我的域類和它停止工作:

錯誤errors.GrailsExceptionResolver - [B不能轉換到的java.sql.Blob 的java.lang。 ClassCastException異常:[B不能轉換到的java.sql.Blob

:-(

回答

4

而不是設置類型BLOB嘗試增加MAXSIZE約束:

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

太棒了!這似乎做了把戲! – rdmueller 2011-01-10 09:57:24

+0

所以這不是一個解決方案!我有這樣的問題,如果我不設置字段的類型blob,在oracle數據庫中字段類型設置爲LONG。我想知道這怎麼能被認爲是正確的答案和好的解決方案。 :) – emilan 2012-10-08 09:00:39

1

我不知道你在你的控制器在做什麼,嘗試做手工來看看會發生什麼:

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

好主意,但不 - 不能解決問題。 – rdmueller 2011-01-09 21:57:19

4

如果您想在Oracle中使用Blob字段,請將您的域屬性設置爲byte []並將類型設置爲org.hibernate.type.MaterializedBlobType。MaterializedBlobType處理Oracle之間來回轉換(可能是其他數據庫,但我只在Oracle上完成)和byte []。

byte[] blobFile 

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

嘗試設置sqlType

使用域場byte[]型與sqlType設置爲"blob"mapping塊的工作我使用Grails 2.3.1和Oracle 11g的。 Grails自動處理類型轉換。

class Image { 
    byte[] image 
    static mapping = { 
     image(sqlType: "blob") 
    } 
} 
相關問題