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/foreach/produceimage/image.jpg");
return IOUtils.toByteArray(in);
}
Здесь мы не определяем, что возвращаемый массив байтов является изображением. Следовательно, клиент не сможет обработать это как изображение — и, скорее всего, браузер просто отобразит фактические байты изображения.
Чтобы определить, что возвращаемый массив байтов соответствует изображению, мы можем установить атрибут products аннотации @GetMapping
,
чтобы указать MIME-тип возвращаемого объекта: ``
@GetMapping(
value = "/get-image-with-media-type",
produces = MediaType.IMAGE_JPEG_VALUE
)
public @ResponseBody byte[] getImageWithMediaType() throws IOException {
InputStream in = getClass()
.getResourceAsStream("/com/foreach/produceimage/image.jpg");
return IOUtils.toByteArray(in);
}
Здесь для производителя
установлено значение MediaType.IMAGE_JPEG_VALUE
, чтобы указать, что возвращаемый объект должен обрабатываться как изображение JPEG.
И теперь браузер распознает и правильно отобразит тело ответа в виде изображения.
5. Использование продуктов
для возврата необработанных данных
Производимый
параметр может иметь множество различных значений (полный список можно найти здесь ) в зависимости от типа объекта, который мы хотим вернуть.
Поэтому, если мы хотим вернуть необработанный файл, мы можем просто использовать APPLICATION_OCTET_STREAM_VALUE
:
@GetMapping(
value = "/get-file",
produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
)
public @ResponseBody byte[] getFile() throws IOException {
InputStream in = getClass()
.getResourceAsStream("/com/foreach/produceimage/data.txt");
return IOUtils.toByteArray(in);
}
6. Заключение
В этой быстрой статье мы рассмотрели простую проблему — возврат изображений или файлов из контроллера Spring.
И, как всегда, пример кода можно найти на Github .