如何在编辑视图grails上更新图像?

时间:2015-04-23 16:57:29

标签: image grails updates

在类域上:

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

我上传了一张图片并将其显示在“编辑”视图中,但即使我不更改图片,更新时也不会保留图像。

1 个答案:

答案 0 :(得分:1)

如果没有更新方法,很难知道如何处理更新。但是在不知情的情况下,当您呈现图像时,我想您将其放在<img>标记中,然后如果用户更新信息而不更改图像,则所有数据都将在{{1}中发送但在这种情况下,params将是avatarUser.picture,因为不存在与您呈现给用户的表单发送的参数相匹配的字段。也许你有一个你在控制器中的字段,因为从表单中发送的图像发送的图像字节在表单中编码为base64可能是一个解决方案,而不是一个非常干净的,但它可以工作。问题是我对你的其他实现知之甚少,但对于我读到的内容,我觉得它可能有用: 在您的更新视图中,隐藏的标记包含以base 64编码的图像:

null

通过这种方式,您可以在更新控制器中获得一个带有base64编码字符串的参数,然后按如下方式解码:

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

然后按照您现在正在使用的方法byte[] image= encodedImage.decodeBase64() 使用它。

希望我选择了你想解决的问题!