1. Обзор
Обслуживание статических файлов клиенту может быть выполнено различными способами, и использование контроллера Spring не обязательно является лучшим доступным вариантом.
Однако иногда маршрут контроллера необходим – и именно на этом мы сосредоточимся в этой краткой статье .
2. Зависимости Maven
Во-первых, нам нужно будет добавить зависимость к вашему pom.xml :
org.springframework.boot spring-boot-starter-web
Вот и все, больше нам здесь ничего не нужно. Для получения информации о версии перейдите в Maven Central .
3. Использование @ResponseBody
Первое простое решение состоит в том, чтобы использовать аннотацию @ResponseBody для метода контроллера, чтобы указать, что объект, возвращаемый методом, должен быть маршалирован непосредственно в тело ответа HTTP:
@GetMapping("/get-text") public @ResponseBody String getText() { return "Hello world"; }
Таким образом, этот метод просто вернет строку Hello world вместо того , чтобы возвращать представление с именем Hello world , как в более типичном приложении MVC.
С помощью @ResponseBody мы можем возвращать практически любой тип носителя, если у нас есть соответствующий HttpMessageConverter, который может обрабатывать и передавать это в выходной поток.
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 возвращаемого объекта:
@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); }
Здесь производит имеет значение Тип носителя.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/baeldung/produceimage/data.txt"); return IOUtils.toByteArray(in); }
6. Заключение
В этой краткой статье мы рассмотрели простую проблему – возврат изображений или файлов с контроллера Spring.
И, как всегда, пример кода можно найти на Github .