我目前正在使用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}"/>
如果我再次传递图像,它将显示图像,但是如果传递另一个图像,它将显示第一个图像。任何帮助将不胜感激。
答案 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());