在我们的应用程序中,我们有两种方式提供图像。
第一个是通过资产管道,第二个是从数据库中获取。
对于主要的公司标题徽标,我们从资产管道提供服务。
gsp 代码看起来像这样
<img src="${resource(dir: 'images', file: 'logo.png')}" />
在 html 中呈现为
<img src="/roadrace/assets/logo-addd262d2fffbdf8d868181896bf1698.png">
当浏览器获取它时,它会按照此请求中的指示正确缓存在内存中,并用红框标记。
在我们展示活动图片的其他地方
代码看起来像这样
<img src="https://.../roadrace/uploads/logos/h1FdUah7vXGqTkq.jpg?1676524906000" id="logo">
这使得获取这个控制器动作的请求
def uploads(String path) {
FileData imageData = FileData.findByPath("/${path}")
if (!imageData) {
response.sendError(404)
return
}
response.contentType = URLConnection.guessContentTypeFromName(path) ?: 'application/octet-stream'
response.getOutputStream().withCloseable {out ->
out.write(imageData.data)
out.flush()
}
}
你可以看到我们首先使用 FileData 域获取图像数据,该域具有写入响应的 byte[] 类型的数据字段。
文件数据定义为
class FileData {
String path
byte[] data
static constraints = {
path blank: false, unique: true
data nullable: false, maxSize: 16_777_215
}
}
所以在这里我们如何添加响应标头,以便该图像也被浏览器缓存?
因为我们只在一个地方使用图片,所以最好不要使用缓存插件来保持应用程序更轻量。
感谢您的帮助!