更改后如何确保目录中的图像被刷新?

时间:2019-05-11 00:01:38

标签: java html spring thymeleaf

我目前正在使用Spring和Thymeleaf创建一个Java Web应用程序,以使用AES加密用户提供的图像并输出加密版本。但是,当我在将图像保存到文件后尝试显示图像时,它似乎还没有更新,并且我收到文件不存在的错误消息。但是,当我检查目录时,显然已经有了。我对Thymeleaf和Spring还很陌生。

我尝试使用Thread.sleep来加载图像。不幸的是它没有改变任何东西。我将图像存储在静态文件夹中。

我的Java代码如下:

String path = new File("src/main/resources/static").getAbsolutePath();
File outputFile = new File(path + "/output.jpg");
try {
  outputFile.createNewFile();
} catch (IOException e) {
  e.printStackTrace();
  System.out.println("FILE ALREADY EXISTS");
}

try {
  ImageIO.write(outputImage, "jpg", outputFile);
} catch (IOException e) {
  e.printStackTrace();
}

model.addAttribute("image", "output.jpg");

我相关的HTML代码如下:

<img th:src="${image}"/>

如果我再次传递图像,它将显示图像,但是如果传递另一个图像,它将显示第一个图像。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的浏览器可能会缓存图像(将其存储在本地以防止将来再次下载)。您可以通过打开浏览器调试器(F12)轻松找到这一事实,并找到禁用缓存的选项。有多种方法可以通过编程方式解决此问题:


最简单的解决方案是每次更改文件时都重命名图像,并使用唯一的文件名提供URL。

console.log(lastFiveUserData[myUserId].age)

如果您不介意每次显示该页面时都会重新下载图像,则可以使用URL中的可变参数来使浏览器缓存无效。

File outputFile = new File(path + "/output-" + LocalDateTime.now() + ".jpg");

使用带有 ETag 的缓存控制,这涉及到您的图像不是静态的,应由控制器进行管理。这是一个带有字节缓冲区的示例:

model.addAttribute("image", "output.jpg?i=" + LocalDateTime.now());