Как реализовать ленивую загрузку изображений base64?

Как получить правильную ссылку на изображение, загруженное в папку /uploads в проекте Spring, чтобы его можно было отобразить в браузере без использования абсолютного пути к файлу? Можно ли реализовать ленивую загрузку изображений с использованием base64?
  • 23 октября 2023 г. 18:07
Ответы на вопрос 1
Для реализации ленивой загрузки изображений base64 в проекте Spring можно использовать следующий подход:

1. В контроллере, отвечающем за обработку запросов на отображение изображений, вместо возвращения ссылки на файл, можно вернуть код base64 изображения.

Пример:
```java
@GetMapping("/image")
public ResponseEntity<byte[]> getImage() throws IOException {
    // Загрузка изображения из папки /uploads
    File file = new File("uploads/image.jpg");
    FileInputStream fis = new FileInputStream(file);
    
    // Преобразование изображения в массив байтов
    byte[] bytes = new byte[(int)file.length()];
    fis.read(bytes);
    fis.close();
    
    // Возврат кода base64 изображения вместо ссылки на файл
    return ResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).body(bytes);
}
```

2. В HTML-шаблоне можно использовать data URI scheme для отображения изображения.

Пример:
```html
<img src="data:image/jpeg;base64,{{base64Image}}" alt="Изображение">
```

3. В соответствующем контроллере необходимо считать код base64 изображения и передать его в HTML-шаблон.

Пример:
```java
@GetMapping("/view")
public String viewImage(Model model) throws IOException {
    // Загрузка кода base64 изображения
    File file = new File("uploads/image.jpg");
    FileInputStream fis = new FileInputStream(file);
    byte[] bytes = new byte[(int)file.length()];
    fis.read(bytes);
    fis.close();
    String base64Image = Base64.getEncoder().encodeToString(bytes);
    
    // Передача кода base64 в HTML-шаблон
    model.addAttribute("base64Image", base64Image);
    
    // Возврат имени HTML-шаблона
    return "view";
}
```

Теперь изображение будет загружаться лениво, только когда оно будет отображаться на странице.
Похожие вопросы