Download een afbeelding of een bestand met Spring MVC

1. Overzicht

Het aanbieden van statische bestanden aan de client kan op verschillende manieren worden gedaan, en het gebruik van een Spring Controller is niet noodzakelijk de best beschikbare optie.

Soms is de controllerroute echter noodzakelijk - en daar zullen we ons in dit korte artikel op concentreren.

2. Maven afhankelijkheden

Eerst moeten we een afhankelijkheid toevoegen aan onze pom.xml:

 org.springframework.boot spring-boot-starter-web 

Dat is alles, we hebben hier verder niets nodig. Ga voor versie-informatie naar Maven Central.

3. Met behulp van @ResponseBody

De eerste eenvoudige oplossing is om de @ResponseBody annotatie op een controllermethode om aan te geven dat het object dat door de methode wordt geretourneerd, rechtstreeks naar de HTTP-antwoordtekst moet worden geleid:

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

Deze methode retourneert dus alleen de string Hallo Wereld in plaats van een weergave terug te sturen waarvan de naam is Hallo Wereld, zoals een meer typische MVC-applicatie.

Met @ResponseBody we kunnen vrijwel elk mediatype retourneren, zolang we een overeenkomstige HTTP-berichtconverter hebben die dat kan verwerken en naar de uitvoerstroom kan leiden.

4. Met behulp van produceert voor het retourneren van afbeeldingen

Door byte-arrays te retourneren, kunnen we bijna alles retourneren - zoals afbeeldingen of bestanden:

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

Hier definiëren we niet dat de geretourneerde byte-array een afbeelding is. Daarom kan de client dit niet als een afbeelding behandelen - en meer dan waarschijnlijk zal de browser eenvoudig de werkelijke bytes van de afbeelding weergeven.

Om te bepalen dat de geretourneerde byte-array overeenkomt met een afbeelding, kunnen we de produceert attribuut van de @GetMapping annotatie om het MIME-type van het geretourneerde object nauwkeurig te bepalen:

@GetMapping (value = "/ get-image-with-media-type", produceert = MediaType.IMAGE_JPEG_VALUE) openbare @ResponseBody byte [] getImageWithMediaType () gooit IOException {InputStream in = getClass () .getResourceAsStream ("/ com / baeldung /produceimage/image.jpg "); retourneer IOUtils.toByteArray (in); } 

Hier produceert ingesteld op MediaType.IMAGE_JPEG_VALUE om aan te geven dat het geretourneerde object moet worden behandeld als een JPEG-afbeelding.

En nu gaat de browser de responsbody herkennen en correct weergeven als een afbeelding.

5. Met behulp van produceert voor het retourneren van onbewerkte gegevens

De parameter produceert kan op veel verschillende waarden worden ingesteld (de volledige lijst is hier te vinden), afhankelijk van het type object dat we willen retourneren.

Daarom, als we een onbewerkt bestand willen retourneren, kunnen we gewoon gebruiken APPLICATION_OCTET_STREAM_VALUE:

@GetMapping (value = "/ get-file", produceert = MediaType.APPLICATION_OCTET_STREAM_VALUE) openbaar @ResponseBody byte [] getFile () gooit IOException {InputStream in = getClass () .getResourceAsStream ("/ com / baeldung / produceimage / data.txt "); retourneer IOUtils.toByteArray (in); } 

6. Conclusie

In dit korte artikel hebben we een eenvoudig probleem bekeken: het retourneren van afbeeldingen of bestanden van een Spring Controller.

En, zoals altijd, is de voorbeeldcode te vinden op Github.