Returende bilde- / mediedata med Spring MVC

1. Oversikt

I denne opplæringen vil vi illustrere hvordan du returnerer bilder og andre medier ved hjelp av Spring MVC-rammeverket.

Vi vil diskutere flere tilnærminger, startende fra direkte manipulering HttpServletResponse enn å gå til tilnærminger som drar nytte av meldingskonvertering, innholdsforhandling og vårens Ressurs abstraksjon. Vi vil se nærmere på hver av dem og diskutere fordeler og ulemper.

2. Bruke HttpServletResponse

Den mest grunnleggende tilnærmingen til nedlasting av bilder er å jobbe direkte mot et respons objekt og etterlign et rent Servlet implementering, og den ble demonstrert ved hjelp av følgende kodebit:

@RequestMapping (value = "/ image-manual-response", method = RequestMethod.GET) public void getImageAsByteArray (HttpServletResponse response) kaster IOException {InputStream in = servletContext.getResourceAsStream ("/ WEB-INF / images / image-image. "); respons.setContentType (MediaType.IMAGE_JPEG_VALUE); IOUtils.copy (i, response.getOutputStream ()); }

Hvis du sender ut følgende forespørsel, blir bildet gjengitt i en nettleser:

//localhost:8080/spring-mvc-xml/image-manual-response.jpg

Implementeringen er ganske grei og enkel på grunn av IOUtils fra org.apache.commons.io pakke. Ulempen med tilnærmingen er imidlertid at den ikke er robust mot potensielle endringer. Mime-typen er hardkodet, og endring av konverteringslogikken eller eksternalisering av bildeplasseringen krever endringer i koden.

Den følgende delen diskuterer en mer fleksibel tilnærming.

3. Bruke HttpMessageConverter

Den forrige delen diskuterte en grunnleggende tilnærming som ikke utnytter funksjonene for Meldingskonvertering og Innholdsforhandling i Spring MVC Framework. For å starte disse funksjonene må vi:

  • Kommenter kontrollmetoden med @ResponseBody kommentar
  • Registrer en passende meldingsomformer basert på returtypen til kontrollermetoden (ByteArrayHttpMessageConverter for eksempel nødvendig for riktig konvertering av bytes-array til en bildefil)

3.1. Konfigurasjon

For å vise konfigurasjonen til omformerne vil vi bruke den innebygde ByteArrayHttpMessageConverter som konverterer en melding når en metode returnerer byte [] type.

De ByteArrayHttpMessageConverter er registrert som standard, men konfigurasjonen er analog for enhver annen innebygd eller tilpasset omformer.

Å bruke meldingsomformerbønnen krever registrering av en passende MessageConverter bønne i Spring MVC-sammenheng og sette opp mediatyper som den skal håndtere. Du kan definere det via XML ved hjelp av stikkord.

Denne taggen skal defineres inne tag, som i følgende eksempel:

     image / jpeg image / png 

Nevnte konfigurasjonsdel registreres ByteArrayHttpMessageConverter til bilde / jpeg og bilde / png svarinnholdstyper. Hvis tag er ikke til stede i mvc-konfigurasjonen, da blir standard sett med omformere registrert.

Du kan også registrere meldingsomformeren ved hjelp av Java-konfigurasjon:

@Override public void configureMessageConverters (Liste omformere) {omformere.add (byteArrayHttpMessageConverter ()); } @Bean public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter () {ByteArrayHttpMessageConverter arrayHttpMessageConverter = ny ByteArrayHttpMessageConverter (); arrayHttpMessageConverter.setSupportedMediaTypes (getSupportedMediaTypes ()); retur arrayHttpMessageConverter; } privat liste getSupportedMediaTypes () {List list = new ArrayList (); list.add (MediaType.IMAGE_JPEG); list.add (MediaType.IMAGE_PNG); list.add (MediaType.APPLICATION_OCTET_STREAM); returliste; }

3.2. Gjennomføring

Nå kan vi implementere metoden vår som vil håndtere forespørsler om media. Som det ble nevnt ovenfor, må du markere kontrollermetoden din med @ResponseBody kommentar og bruk byte [] som den returnerende typen:

@RequestMapping (value = "/ image-byte-array", method = RequestMethod.GET) public @ResponseBody byte [] getImageAsByteArray () kaster IOException {InputStream i = servletContext.getResourceAsStream ("/ WEB-INF / bilder / bilde-eksempel) .jpg "); returner IOUtils.toByteArray (in); }

For å teste metoden, send følgende forespørsel i nettleseren din:

//localhost:8080/spring-mvc-xml/image-byte-array.jpg

På fordelesiden vet metoden ingenting om HttpServletResponse, konverteringsprosessen er svært konfigurerbar, alt fra å bruke tilgjengelige omformere til å spesifisere en tilpasset. Innholdstypen til svaret trenger ikke å være hardkodet, men det vil bli forhandlet ut basert på forespørselstypesuffikset .jpg.

Ulempen med denne tilnærmingen er at du må implementere logikken eksplisitt for å hente bildet fra en datakilde (lokal fil, ekstern lagring osv.), Og at du ikke har kontroll over topptekstene eller statuskoden for svaret.

4. Bruke ResponseEntity Klasse

Du kan returnere et bilde som byte [] innpakket i Svarenhet. Vår MVC ResponseEntity muliggjør kontroll ikke bare over hoveddelen av HTTP-responsen, men også overskriften og responsstatuskoden. Etter denne tilnærmingen må du definere returtypen til metoden som ResponseEntity og skape retur ResponseEntity objekt i metodekroppen.

@RequestMapping (value = "/ image-response-entity", method = RequestMethod.GET) public ResponseEntity getImageAsResponseEntity () {HttpHeaders headers = new HttpHeaders (); InputStream in = servletContext.getResourceAsStream ("/ WEB-INF / images / image-example.jpg"); byte [] media = IOUtils.toByteArray (in); headers.setCacheControl (CacheControl.noCache (). getHeaderValue ()); ResponseEntity responseEntity = ny ResponseEntity (media, overskrifter, HttpStatus.OK); returresponsEntity; }

Bruker ResponseEntity lar deg konfigurere en responskode for en gitt forespørsel.

Eksplisitt innstilling av responskoden er spesielt nyttig i møte med en eksepsjonell hendelse, f.eks. hvis bildet ikke ble funnet (FileNotFoundException) eller er ødelagt (IOException). I disse tilfellene er alt som trengs å sette svarkoden f.eks. ny ResponseEntity (null, overskrifter, HttpStatus.NOT_FOUND), i en tilstrekkelig fangstblokk.

I tillegg, hvis du trenger å angi noen spesifikke overskrifter i svaret ditt, er denne tilnærmingen enklere enn å sette overskrifter ved hjelp av HttpServletResponse objekt som aksepteres av metoden som en parameter. Det gjør metodesignaturen tydelig og fokusert.

5. Returbilde ved hjelp av Ressurs Klasse

Til slutt kan du returnere et bilde i form av Ressurs gjenstand.

De Ressurs grensesnitt er et grensesnitt for å abstrahere tilgang til ressurser på lavt nivå. Den ble introdusert om våren som en mer dyktig erstatning for standarden java.net.URL klasse. Det gir enkel tilgang til forskjellige typer ressurser (lokale filer, eksterne filer, classpath-ressurser) uten behov for å skrive en kode som eksplisitt henter dem.

For å bruke denne tilnærmingen, skal returtypen til metoden settes til Ressurs og du må kommentere metoden med @ResponseBody kommentar.

5.1. Gjennomføring

@ResponseBody @RequestMapping (value = "/ image-resource", method = RequestMethod.GET) public Resource getImageAsResource () {return new ServletContextResource (servletContext, "/WEB-INF/images/image-example.jpg"); }

eller hvis vi ønsker mer kontroll over svaroverskriftene:

@RequestMapping (value = "/ image-resource", method = RequestMethod.GET) @ResponseBody public ResponseEntity getImageAsResource () {HttpHeaders headers = new HttpHeaders (); Ressursressurs = ny ServletContextResource (servletContext, "/WEB-INF/images/image-example.jpg"); returner ny ResponseEntity (ressurs, overskrifter, HttpStatus.OK); }

Ved å bruke denne tilnærmingen behandler du bilder som ressurser som kan lastes inn ved hjelp av ResourceLoader grensesnittimplementering. I slike tilfeller trekker du ut den nøyaktige plasseringen av bildet ditt og ResourceLoader bestemmer hvor den lastes.

Det gir en vanlig tilnærming for å kontrollere plasseringen av bilder ved hjelp av konfigurasjonen, og eliminere behovet for å skrive filinnlastingskode.

6. Konklusjon

Blant de ovennevnte tilnærmingene startet vi fra den grunnleggende tilnærmingen, og brukte deretter tilnærmingen som drar nytte av rammeverket for konvertering av meldinger. Vi diskuterte også hvordan du får settet svarskoden og svaroverskriftene uten å gi svarobjektet direkte.

Til slutt la vi til fleksibilitet fra synspunktene til bildeplasseringene, fordi hvor du skal hente et bilde fra, er definert i konfigurasjonen som er lettere å endre på farten.

Last ned et bilde eller en fil med Spring forklarer hvordan du kan oppnå det samme ved hjelp av Spring Boot.

Eksempelkoden etter opplæringen er tilgjengelig på GitHub.


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