Last ned et bilde eller en fil med Spring MVC

1. Oversikt

Servering av statiske filer til klienten kan gjøres på en rekke måter, og bruk av en Spring Controller er ikke nødvendigvis det beste tilgjengelige alternativet.

Noen ganger er imidlertid kontrollerruten nødvendig - og det er det vi skal fokusere på i denne raske artikkelen.

2. Maven-avhengigheter

Først må vi legge til en avhengighet av vår pom.xml:

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

Det er alt, vi trenger ikke noe annet her. For versjonsinformasjon, gå over til Maven Central.

3. Bruke @ResponseBody

Den første enkle løsningen er å bruke @ResponseBody kommentar på en kontrollermetode for å indikere at objektet som returneres ved metoden, skal samles direkte til HTTP-responsorganet:

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

Dermed vil denne metoden bare returnere strengen Hei Verden i stedet for å returnere en visning med navnet Hei Verden, som et mer typisk MVC-program.

Med @ResponseBody Vi kan returnere stort sett alle mediatyper, så lenge vi har en tilsvarende HTTP-meldingsomformer som kan håndtere og samordne det til utdatastrømmen.

4. Bruke produserer for returbilder

Ved å returnere byte-matriser kan vi returnere nesten hva som helst - for eksempel bilder eller filer:

@GetMapping (value = "/ 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 den returnerte byte-matrisen er et bilde. Derfor klienten vil ikke være i stand til å håndtere dette som et bilde - og mer enn sannsynlig vil nettleseren bare vise de faktiske byte på bildet.

For å definere at den returnerte byte-matrisen tilsvarer et bilde, kan vi stille inn produserer attributt til @GetMapping kommentar for å presisere MIME-typen for det returnerte objektet:

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

Her produserer er satt til MediaType.IMAGE_JPEG_VALUE for å indikere at det returnerte objektet må håndteres som et JPEG-bilde.

Og nå kommer nettleseren til å gjenkjenne og vise svarteksten riktig som et bilde.

5. Bruke produserer for å returnere rådata

Parameteren produserer kan settes til mange forskjellige verdier (den komplette listen finner du her), avhengig av typen objekt vi vil returnere.

Derfor, hvis vi ønsker å returnere en rå fil, kan vi bare bruke APPLICATION_OCTET_STREAM_VALUE:

@GetMapping (value = "/ get-file", produserer = 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. Konklusjon

I denne raske artikkelen så vi på et enkelt problem - å returnere bilder eller filer fra en Spring Controller.

Og som alltid kan eksempelkoden finnes på Github.


$config[zx-auto] not found$config[zx-overlay] not found