Frage

Ich möchte ein Bild hochladen groovigem auf Grails verwenden. Meine gsp Seite ist wie folgt (ich eine vereinfachte Version des Original-bin zeigt)

<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>

Meine Domain-Klasse ist wie folgt:

class Post {    

byte[] myPicture

static mapping = {
    myPicture type:  "blob" 
}

Ich brauche diese Zuordnung sonst wird MySql eine smallblob schaffen, die zu klein ist, um die Bilder zu passen

static constraints = {
    myPicture(nullable:false)      
}

}

Bei der Steuerung Ich habe eine Aktion aufgerufen speichern, die wie folgt lautet:

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

Die Ausnahme wird ausgelöst, wenn ich versuche, das Bild in der DB zu speichern.

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 kann nicht auf java.sql.Blob gegossen werden

Jeder Hinweis, warum ist denn das?

BTW, habe ich in einem Tutorial gesehen, die Bilder als Strings behandelt wurden, aber es hat nicht funktioniert als auch.

War es hilfreich?

Lösung

versuchen, auf diese Weise:

  def save = {                               

    def post = loadPost(params.id)

    def f = request.getFile('myPicture')             

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


    if(post.save()) {

Andere Tipps

fand ich eine ähnliche Frage auf Nabble:

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

Zwei mögliche Lösungen werden vorgeschlagen:

  • ändern Sie die Einschränkungen der Blobs Eigenschaft zu einer großen Max-Größe, um es zu stoppen verwenden „TINYBLOB“.
  • Verwenden Sie die Hibernate Blob Implementierung statt byte [] für die Typdeklaration Eigentum. Dies erfordert, dass Sie Daten in die BLOB-Stream, statt direkter Zuordnung, aber die Post oben gibt Code so zu tun.

können Sie versuchen, Spring 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')
    }
}

Ich glaube, Sie f.bytes direkt zugreifen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top