Перейти к основному содержимому

Загрузите изображение или файл с помощью Spring MVC

· 3 мин. чтения

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 .