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 :(得分: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()
使用它。
希望我选择了你想解决的问题!