Рубрики
Без рубрики

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

Краткое и практическое руководство по возвращению изображения в конечную точку Spring REST.

Автор оригинала: baeldung.

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 .