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

1. Обзор

Доставка статических файлов клиенту может осуществляться различными способами, и использование Spring Controller не обязательно является наилучшим доступным вариантом.

Однако иногда необходим маршрут контроллера - и это то, на чем мы собираемся сосредоточиться в этой быстрой статье.

2. Использование @ ResponseBody

Первое простое решение - использовать аннотацию @ ResponseBody в методе контроллера, чтобы указать, что объект, возвращаемый этим методом, должен быть перенаправлен непосредственно в тело ответа HTTP:

@GetMapping("/get-text")
public @ResponseBody String getText() {
    return "Hello world";
}

Таким образом, этот метод будет просто возвращать строку Hello world вместо того, чтобы возвращать представление с именем Hello world , как в более типичном приложении MVC.

С @ ResponseBody мы можем вернуть практически любой тип медиа, если у нас есть соответствующий конвертер HTTP-сообщений, который может обрабатывать и маршалировать это в выходной поток.

3. Использование produces для возврата изображений

Возврат байтовых массивов позволяет нам возвращать почти все - например, изображения или файлы:

@GetMapping(value = "/image")
public @ResponseBody byte[]getImage() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}

Здесь мы не определяем, что возвращенный байтовый массив является изображением.

Поэтому клиент не сможет обработать это как изображение - и, скорее всего, браузер просто отобразит фактические байты изображения.

Чтобы определить, что возвращенный байтовый массив соответствует изображению, мы можем установить атрибут produces аннотации @ 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);
}

Здесь produces имеет значение MediaType.IMAGE JPEG VALUE , чтобы указать, что возвращаемый объект должен быть обработан как изображение JPEG

И теперь браузер распознает и правильно отобразит тело ответа в виде изображения.

4. Использование produces для возврата необработанных данных

Параметр produces может быть настроен на множество разных значений (полный список можно найти http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/MediaType.html .[здесь]) в зависимости от типа объекта, который мы хотим вернуть.

Поэтому, если мы хотим вернуть необработанный файл, мы можем просто использовать 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);
}

5. Вывод

В этой быстрой статье мы рассмотрели простую проблему - возврат изображений или файлов из Spring Controller.

И, как всегда, пример кода можно найти over на Github .