Как обеспечить обновление изображения в каталоге после его изменения? - PullRequest
1 голос
/ 11 мая 2019

В настоящее время я создаю веб-приложение на Java с использованием Spring и Thymeleaf для шифрования предоставленного пользователем изображения с помощью 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 голосов
/ 11 мая 2019

Ваш браузер, вероятно, кэширует изображение (хранит его локально, чтобы в дальнейшем не загружать его).Вы можете легко проверить этот факт, открыв отладчик браузера (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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...