質問

grails に groovy を使用して画像をアップロードしたいと考えています。私のgspページは次のとおりです(オリジナルの簡略版を示しています)

<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 が画像に適合するには小さすぎる小さなブロブを作成します。

static constraints = {
    myPicture(nullable:false)      
}

}

コントローラーには、次のような save というアクションがあります。

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])
    }
}

画像を DB に保存しようとすると例外がスローされます。

2009-04-27 18:16:07,319 [20806951@qtp0-0] 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 にキャストすることはできません

ヒントはありますか?これはなぜですか?

ところで、私はチュートリアルで、画像が文字列として処理されたが、それもうまく機能しなかったことを見てきました。

役に立ちましたか?

解決

この方法を試してみます:

  def save = {                               

    def post = loadPost(params.id)

    def f = request.getFile('myPicture')             

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


    if(post.save()) {

他のヒント

Nabble で同様の質問を見つけました。

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

考えられる解決策として次の 2 つが提案されています。

  • BLOB プロパティの制約を大きな最大サイズに変更して、「TinyBlob」の使用を停止します。
  • プロパティの型宣言には byte[] の代わりに Hibernate Blob 実装を使用します。これには、直接割り当てではなく、Blob にデータをストリーミングする必要がありますが、上記の投稿にはそのためのコードが記載されています。

あなたはSpringの<のhref = "http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/multipart/MultipartFile.html" のrel = "nofollowをnoreferrerを使用して試すことができます「> MultipartFile をごloadPost()メソッド内で?

ここでドキュメント:

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にアクセスすることができると信じています。

scroll top