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 .