如何在 grails 中缓存从数据库中读取的图像?

问题描述 投票:0回答:0

在我们的应用程序中,我们有两种方式提供图像。

第一个是通过资产管道,第二个是从数据库中获取。

对于主要的公司标题徽标,我们从资产管道提供服务。

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

所以在这里我们如何添加响应标头,以便该图像也被浏览器缓存?

因为我们只在一个地方使用图片,所以最好不要使用缓存插件来保持应用程序更轻量。

感谢您的帮助!

java caching grails response-headers grails-4
© www.soinside.com 2019 - 2024. All rights reserved.