Классовое исключение приведения в Groovy - PullRequest
1 голос
/ 27 апреля 2009

Я хочу загрузить изображение, используя Groovy на Grails. Моя страница 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])
    }
}

Исключение выдается при попытке сохранить изображение в БД.

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

Любой намек, почему это?

Кстати, я видел в учебнике, что изображения обрабатывались как строки, но это не работало а также.

Ответы [ 3 ]

2 голосов
/ 27 апреля 2009

Можете ли вы попробовать использовать Spring's 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 напрямую.

2 голосов
/ 27 апреля 2009

Я нашел похожий вопрос по Набблу:

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

Предлагаются два возможных решения:

  • Измените ограничения свойства BLOB-объекта на большой максимальный размер, чтобы он не использовал "TinyBlob".
  • Используйте реализацию Hibernate Blob вместо byte [] для объявления типа свойства. Это потребует от вас потоковой передачи данных в Blob вместо прямого назначения, но в посте выше приведен код для этого.
1 голос
/ 04 мая 2009

попробуйте так:

  def save = {                               

    def post = loadPost(params.id)

    def f = request.getFile('myPicture')             

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


    if(post.save()) {
...