2009-04-27 44 views
1

我想在grails上使用groovy上傳圖像。 我的GSP頁面如下(我顯示原來的簡化版本)Groovy中的類拋出異常

<g:form controller="post" action="save" enctype="multipart/form-data">   
     My picture <input type="file" name="myPicture" />  
    <g:submitButton name="submit" value="Save"/> 
</g:form> 

我的域類如下:

class Post {  

byte[] myPicture 

static mapping = { 
    myPicture type: "blob" 
} 

我需要這種映射,否則MySQL將創建一個smallblob其是要小,以適應圖像

static constraints = { 
    myPicture(nullable:false)  
} 

} 

在控制器我呼籲節省了操作的如下:

def save = {        
    def post = loadPost(params.id) 

    post.properties = params 

    if(post.save()) { 
     print "hallo world"    
     redirect(action:'list', params:params) 
    } else { 
     render(view:'edit', model:[post:post]) 
    } 
} 

當我嘗試將圖像保存在數據庫時引發異常。

2009-04-27 18:16:07,319 [[email protected]] ERROR errors.GrailsExceptionResolver - java.lang.ClassCastException: [B cannot be cast to java.sql.Blob 

org.codehaus.groovy.runtime.InvokerInvocationException:java.lang.ClassCastException:[B不能轉換到的java.sql.Blob

任何暗示這是爲什麼?

順便說一句,我已經看到一個教程,圖像被處理爲字符串,但它也不工作 。

+0

什麼是您的loadPost()方法呢? – 2009-04-27 17:02:29

+0

沒什麼特別的 private loadPost(id){ def post = new Post(); 如果(ID){ 交= Post.get(ID) } 返回交 } – Luixv 2009-04-28 11:27:51

+0

@Miguel平提供了一段代碼是用於上載正確的,但並沒有解決類轉換異常。爲了「保存」圖像,必須使用方法getBytes() – Luixv 2009-04-28 11:29:54

回答

1

試試這個方法:

def save = {        

    def post = loadPost(params.id) 

    def f = request.getFile('myPicture')    

    post.myPicture = f.getBytes() 
    post.pictureType = f.getContentType()      


    if(post.save()) { 
2

我發現Nabble一個類似的問題:

http://www.nabble.com/MySQL-and-Blobs-td16116885.html

兩個可能的解決方案建議:

  • 更改BLOB屬性的一個大最大尺寸的限制,阻止它從使用「TinyBlob」。
  • 使用Hibernate Blob實現而不是byte []作爲屬性的類型聲明。這將需要您將數據流式傳輸到Blob中,而不是直接分配,但上面的文章給出了代碼。
2

你可以嘗試在loadPost()方法中使用Spring的MultipartFile嗎?

下面是來自docs一個例子:

def upload = { 
    def f = request.getFile('myFile') 
    if(!f.empty) { 
     f.transferTo(new File('/some/local/dir/myfile.txt')) 
     response.sendError(200,'Done'); 
    }  
    else { 
     flash.message = 'file cannot be empty' 
     render(view:'uploadForm') 
    } 
} 

我相信你可以直接訪問f.bytes