Изтеглете изображение или файл с Spring MVC

1. Общ преглед

Сервирането на статични файлове на клиента може да се извърши по различни начини и използването на Spring Controller не е непременно най-добрата налична опция.

Понякога обаче е необходим маршрута на контролера - и именно върху това ще се фокусираме в тази кратка статия.

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 можем да върнем почти всеки тип медия, стига да имаме съответстващ преобразувател на HTTP съобщения, който може да обработва и разпределя това към изходния поток.

4. Използване на произвежда за връщане на изображения

Връщащите се байтови масиви ни позволяват да върнем почти всичко - например изображения или файлове:

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

Тук не дефинираме, че върнатият байтов масив е изображение. Следователно клиентът няма да може да се справи с това като изображение - и повече от вероятно браузърът просто ще покаже действителните байтове на изображението.

За да определите, че върнатите съответства масив от байтове към изображение, ние можем да настроите произвежда атрибут на @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); } 

Тук произвежда е настроен да 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/baeldung/produceimage/data.txt"); return IOUtils.toByteArray(in); } 

6. Заключение

В тази бърза статия разгледахме един прост проблем - връщане на изображения или файлове от Spring Controller.

И както винаги примерният код може да бъде намерен в Github.