«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.
«