2015-04-23 3 views
0

на класс домена:Как обновить изображение при редактировании вида grails?

class Employee { 

    String name 
    ... 
    ... 
    byte[] picture 
    static constraints = { 
     name() 
     ..... 
     picture (nullable:true, maxSize: 1048576 /* 16K */) 
    } 
} 

на представлении формы:

<div id="preview" class="thumbnail"> 
    <a href="#" id="file-select" class="btn btn-default">Choose File</a> 
    <img class="img-circle" alt="User Image" style="width:100%;" 
     src="${employeeInstance?.picture? 
     createLink(controller:'employee', action:'image', 
     id:employeeInstance.id):assetPath(src: 'user-default.png')}"/> 
</div> 
<input type="file" id="picture" name="picture" class="form-control" /> 
<span class="alert alert-info" id="file-info">No file yet</span> 

на контроллере:

def image() { 
    def avatarUser = Employee.get(params.id) 
    if (!avatarUser || !avatarUser.picture){//|| !avatarUser.avatarType) { 
     response.sendError(404) 
     return 
    } 
    response.contentType = "image/jpeg"//avatarUser.avatarType 
    response.contentLength = avatarUser.picture.size() 
    OutputStream out = response.outputStream 
    out.write(avatarUser.picture) 
    out.close() 
} 

protected void notFound() { 
    request.withFormat { 
     form multipartForm { 
      flash.message = message(code: 'default.not.found.message', args: [message(code: 'employee.label', default: 'Employee'), params.id]) 
      redirect action: "index", method: "GET" 
     } 
    } 
} 

Я загрузить изображение и представить его на редактирование зрения, но во время обновления не сохраняет изображение, даже если я не меняю изображение.

+0

Как выглядит ваш метод обновления? – Gregg

ответ

1

Без способа обновления сложно узнать, как вы обрабатываете обновление. Но, не зная многого, когда вы представляете изображение, я полагаю, вы положили его в тег <img>, а затем, если пользователь обновляет информацию, не меняя изображения, все данные отправляются в params, но в этом случае avatarUser.picture будет be null, так как там не будет поля, которое соответствует этому параметру, отправляемому из формы, которую вы представили пользователю. Возможно, если бы у вас было поле, которое вы использовали в контроллере, так как изображение, отправленное из формы, в которой были байты изображения, закодированные как base64 в форме, может быть решением, а не очень чистым, но оно будет работать. Проблема в том, я не знаю, большая часть остальной части вашей реализации, но за то, что я прочитал, я думаю, что это может работать: в вашем обновлении просмотра скрытого тега с изображением закодированной в базе 64:

<input type="hidden" name="name-you-expect-in-update-controller" value="${Employee.picture.encodeBase64().toString()}" /> 

Это как вы получите в контроллере обновления параметр с кодировкой base64 строки, которые вы затем дешифровать следующим образом:

byte[] image= encodedImage.decodeBase64() 

, а затем использовать его с методом image(), как вы делаете сейчас.

Надеюсь, я взял трек, который вы хотели решить проблему!

Смежные вопросы