«1. Обзор

Подача статических файлов клиенту может осуществляться различными способами, и использование контроллера Spring не обязательно является лучшим доступным вариантом.

Однако иногда маршрут контроллера необходим — и это то, на чем мы сосредоточимся в этой быстрой статье.

2. Зависимости Maven

Во-первых, нам нужно добавить зависимость в наш pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Вот и все, нам больше ничего не нужно. Для получения информации о версии перейдите на Maven Central.

3. Использование @ResponseBody

Первое простое решение — использовать аннотацию @ResponseBody в методе контроллера, чтобы указать, что объект, возвращаемый методом, должен быть передан непосредственно в тело ответа HTTP:

@GetMapping("/get-text")
public @ResponseBody String getText() {
    return "Hello world";
}

~~ ~ Таким образом, этот метод просто вернет строку Hello world, а не представление с именем Hello world, как в более типичном приложении MVC.

С помощью @ResponseBody мы можем вернуть практически любой тип мультимедиа, если у нас есть соответствующий преобразователь HTTP-сообщений, который может обрабатывать и упорядочивать его в выходной поток.

4. Использование продуктов для возврата изображений

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

@GetMapping(value = "/image")
public @ResponseBody byte[] getImage() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}

Здесь мы не определяем, что возвращаемый массив байтов картинка. Следовательно, клиент не сможет обработать это как изображение — и, скорее всего, браузер просто отобразит фактические байты изображения.

Чтобы определить, что возвращаемый массив байтов соответствует изображению, мы можем установить атрибут products аннотации @GetMapping для уточнения MIME-типа возвращаемого объекта: чтобы указать, что возвращенный объект должен обрабатываться как изображение JPEG.

@GetMapping(
  value = "/get-image-with-media-type",
  produces = MediaType.IMAGE_JPEG_VALUE
)
public @ResponseBody byte[] getImageWithMediaType() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}

Теперь браузер распознает и правильно отобразит тело ответа в виде изображения.

5. Использование продактов для возврата сырых данных

Параметр продактс может иметь множество различных значений (полный список можно найти здесь) в зависимости от типа объекта, который мы хотим вернуть.

Поэтому, если мы хотим вернуть необработанный файл, мы можем просто использовать APPLICATION_OCTET_STREAM_VALUE:

6. Заключение

@GetMapping(
  value = "/get-file",
  produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
)
public @ResponseBody byte[] getFile() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/data.txt");
    return IOUtils.toByteArray(in);
}

В этой быстрой статье мы рассмотрели простую проблему — возврат изображений. или файлы из контроллера Spring.

И, как всегда, пример кода можно найти на Github.

«