Download et billede eller en fil med Spring MVC

1. Oversigt

Servering af statiske filer til klienten kan udføres på en række forskellige måder, og brug af en Spring Controller er ikke nødvendigvis den bedste tilgængelige mulighed.

Nogle gange er controllerruten dog nødvendig - og det er det, vi fokuserer på i denne hurtige artikel.

2. Maven-afhængigheder

Først skal vi tilføje en afhængighed af vores pom.xml:

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

Det er alt, vi har ikke brug for noget andet her. For versionoplysninger, gå over til Maven Central.

3. Brug @ResponseBody

Den første enkle løsning er at bruge @ResponseBody kommentar på en controller-metode for at indikere, at objektet, der returneres ved metoden, skal samles direkte til HTTP-responsorganet:

@GetMapping ("/ get-text") offentlig @ResponseBody String getText () {returner "Hej verden"; } 

Således returnerer denne metode bare strengen Hej Verden i stedet for at returnere en visning, hvis navn er Hej Verden, som en mere typisk MVC-applikation.

Med @ResponseBody vi kan returnere stort set alle medietyper, så længe vi har en tilsvarende HTTP-meddelelsesomformer, der kan håndtere og samle det til outputstrømmen.

4. Brug producerer til returbilleder

Returnering af byte-arrays giver os mulighed for at returnere næsten alt - f.eks. Billeder eller filer:

@GetMapping (værdi = "/ image") offentlig @ResponseBody byte [] getImage () kaster IOException {InputStream i = getClass () .getResourceAsStream ("/ com / baeldung / produceimage / image.jpg"); returner IOUtils.toByteArray (in); } 

Her definerer vi ikke, at det returnerede byte-array er et billede. Derfor vil klienten ikke være i stand til at håndtere dette som et billede - og mere end sandsynligt vil browseren blot vise de faktiske bytes på billedet.

For at definere, at det returnerede byte-array svarer til et billede, kan vi indstille producerer attribut for @GetMapping kommentar for at præcisere MIME-typen for det returnerede objekt:

@GetMapping (værdi = "/ get-image-med-mediatype", producerer = MediaType.IMAGE_JPEG_VALUE) offentlig @ResponseBody byte [] getImageWithMediaType () kaster IOException {InputStream i = getClass () .getResourceAsStream ("/ com / baeldung /produceimage/image.jpg "); returner IOUtils.toByteArray (in); } 

Her producerer er indstillet til MediaType.IMAGE_JPEG_VALUE for at angive, at det returnerede objekt skal håndteres som et JPEG-billede.

Og nu vil browseren genkende og korrekt vise svarteksten som et billede.

5. Brug producerer til returnering af rådata

Parameteren producerer kan indstilles til mange forskellige værdier (den komplette liste kan findes her) afhængigt af den type objekt, vi vil returnere.

Derfor, hvis vi vil returnere en rå fil, kan vi simpelthen bruge APPLICATION_OCTET_STREAM_VALUE:

@GetMapping (værdi = "/ get-fil", producerer = MediaType.APPLICATION_OCTET_STREAM_VALUE) offentlig @ResponseBody byte [] getFile () kaster IOException {InputStream i = getClass () .getResourceAsStream ("/ com / baeldung / produceimage / data.t "); returner IOUtils.toByteArray (in); } 

6. Konklusion

I denne hurtige artikel så vi på et simpelt problem - at returnere billeder eller filer fra en Spring Controller.

Og som altid kan eksempelkoden findes på Github.