Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确保在目录中的映像刷新后';什么改变了?_Java_Html_Spring_Thymeleaf - Fatal编程技术网

Java 如何确保在目录中的映像刷新后';什么改变了?

Java 如何确保在目录中的映像刷新后';什么改变了?,java,html,spring,thymeleaf,Java,Html,Spring,Thymeleaf,我目前正在使用Spring和Thymeleaf创建一个Java web应用程序,用AES加密用户提供的图像,并输出一个加扰版本。但是,当我在将图像保存到文件后尝试显示图像时,它似乎还没有更新,并且我得到一个错误,即该文件不存在。然而,当我查看我的目录时,它显然已经存在了。我对百里香和春天是相当陌生的 我已尝试使用Thread.sleep以允许加载图像。不幸的是,它没有改变任何事情。我将图像存储在静态文件夹中 我的Java代码如下: String path = new File("src/main

我目前正在使用Spring和Thymeleaf创建一个Java web应用程序,用AES加密用户提供的图像,并输出一个加扰版本。但是,当我在将图像保存到文件后尝试显示图像时,它似乎还没有更新,并且我得到一个错误,即该文件不存在。然而,当我查看我的目录时,它显然已经存在了。我对百里香和春天是相当陌生的

我已尝试使用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}"/>


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

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


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

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

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

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

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

private static final CacheControl CACHE_CONTROL = CacheControl.noCache().cachePrivate().mustRevalidate();

@GetMapping(value = "/image", produces = { MediaType.IMAGE_JPEG_VALUE })
public ResponseEntity<byte[]> getImage(WebRequest webRequest) {
    byte[] imageBytes = // Load or generate the image bytes here
    String eTagId     = // Generate a unique eTagId for each version of your image
    if (webRequest.checkNotModified(eTagId))
        return ResponseEntity.status(HttpStatus.NOT_MODIFIED).body(null);

    return ResponseEntity.ok().cacheControl(CACHE_CONTROL).eTag(eTagId).body(imageBytes);
}
private static final CacheControl CACHE\u CONTROL=CacheControl.noCache().cachePrivate().mustRevalidate();
@GetMapping(value=“/image”,products={MediaType.image\u JPEG\u value})
公共响应getImage(WebRequest WebRequest){
byte[]imageBytes=//在此处加载或生成图像字节
String eTagId=//为图像的每个版本生成唯一的eTagId
if(webRequest.checkNotModified(eTagId))
返回ResponseEntity.status(HttpStatus.NOT_MODIFIED).body(null);
返回ResponseEntity.ok().cacheControl(CACHE_CONTROL).eTag(eTagId).body(imageBytes);
}

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


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

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

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

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

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

private static final CacheControl CACHE_CONTROL = CacheControl.noCache().cachePrivate().mustRevalidate();

@GetMapping(value = "/image", produces = { MediaType.IMAGE_JPEG_VALUE })
public ResponseEntity<byte[]> getImage(WebRequest webRequest) {
    byte[] imageBytes = // Load or generate the image bytes here
    String eTagId     = // Generate a unique eTagId for each version of your image
    if (webRequest.checkNotModified(eTagId))
        return ResponseEntity.status(HttpStatus.NOT_MODIFIED).body(null);

    return ResponseEntity.ok().cacheControl(CACHE_CONTROL).eTag(eTagId).body(imageBytes);
}
private static final CacheControl CACHE\u CONTROL=CacheControl.noCache().cachePrivate().mustRevalidate();
@GetMapping(value=“/image”,products={MediaType.image\u JPEG\u value})
公共响应getImage(WebRequest WebRequest){
byte[]imageBytes=//在此处加载或生成图像字节
String eTagId=//为图像的每个版本生成唯一的eTagId
if(webRequest.checkNotModified(eTagId))
返回ResponseEntity.status(HttpStatus.NOT_MODIFIED).body(null);
返回ResponseEntity.ok().cacheControl(CACHE_CONTROL).eTag(eTagId).body(imageBytes);
}

感谢您的快速响应,但不幸的是,在禁用缓存后,没有任何变化感谢快速响应,但不幸的是,在禁用缓存后,没有任何变化