Returnering af billed- / mediedata med Spring MVC

1. Oversigt

I denne vejledning illustrerer vi, hvordan du returnerer billeder og andre medier ved hjælp af Spring MVC-rammen.

Vi vil diskutere flere tilgange, startende fra direkte manipulation HttpServletResponse end at flytte til tilgange, der drager fordel af meddelelseskonvertering, indholdsforhandling og forårets Ressource abstraktion. Vi ser nærmere på hver af dem og diskuterer deres fordele og ulemper.

2. Brug af HttpServletResponse

Den mest grundlæggende tilgang til billeddownload er at arbejde direkte mod en respons objekt og efterligne en ren Servlet implementering, og det demonstreres ved hjælp af følgende uddrag:

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

Udstedelse af følgende anmodning gengiver billedet i en browser:

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

Implementeringen er ret ligetil og enkel på grund af IOUtils fra org.apache.commons.io pakke. Ulempen ved fremgangsmåden er dog, at den ikke er robust over for de potentielle ændringer. Mime-typen er hårdkodet, og ændringen af ​​konverteringslogikken eller eksternalisering af billedplaceringen kræver ændringer i koden.

Det følgende afsnit diskuterer en mere fleksibel tilgang.

3. Brug af HttpMessageConverter

Det foregående afsnit diskuterede en grundlæggende tilgang, der ikke udnytter funktionerne i Message Conversion og Content Negotiation i Spring MVC Framework. For at starte disse funktioner skal vi:

  • Kommenter controller-metoden med @ResponseBody kommentar
  • Registrer en passende meddelelsesomformer baseret på returtypen for controller-metoden (ByteArrayHttpMessageConverter for eksempel nødvendigt til korrekt konvertering af bytes-array til en billedfil)

3.1. Konfiguration

Til fremvisning af konfiguration af konvertere bruger vi den indbyggede ByteArrayHttpMessageConverter der konverterer en besked, hver gang en metode returnerer byte [] type.

Det ByteArrayHttpMessageConverter er registreret som standard, men konfigurationen er analog for enhver anden indbygget eller brugerdefineret konverter.

Anvendelse af meddelelsesomformerbønnen kræver registrering af en passende MessageConverter bønne inden for Spring MVC-sammenhæng og opsætning af medietyper, som den skal håndtere. Du kan definere det via XML ved hjælp af tag.

Dette tag skal defineres indeni tag, som i følgende eksempel:

     billede / jpeg billede / png 

Den førnævnte konfigurationsdel registreres ByteArrayHttpMessageConverter til billede / jpeg og billede / png svarindholdstyper. Hvis tag er ikke til stede i mvc-konfigurationen, så vil standard sæt konvertere blive registreret.

Du kan også registrere meddelelsesomformeren ved hjælp af Java-konfiguration:

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

3.2. Implementering

Nu kan vi implementere vores metode, der håndterer anmodninger om medier. Som det blev nævnt ovenfor, skal du markere din controller-metode med @ResponseBody kommentar og brug byte [] som den returnerende type:

@RequestMapping (værdi = "/ image-byte-array", metode = RequestMethod.GET) offentlig @ResponseBody byte [] getImageAsByteArray () kaster IOException {InputStream i = servletContext.getResourceAsStream ("/ WEB-INF / images / image-eksempel) .jpg "); returner IOUtils.toByteArray (in); }

For at teste metoden skal du udstede følgende anmodning i din browser:

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

På fordelingssiden ved metoden intet om HttpServletResponse, konverteringsprocessen er meget konfigurerbar, lige fra brug af de tilgængelige konvertere til angivelse af en brugerdefineret. Svarets indholdstype behøver ikke at være hårdkodet, men det forhandles ud fra suffikset med anmodningsstien .jpg.

Ulempen ved denne tilgang er, at du eksplicit skal implementere logikken til at hente billedet fra en datakilde (lokal fil, ekstern lagring osv.), Og at du ikke har kontrol over overskrifterne eller statuskoden for svaret.

4. Brug af SvarEnhed Klasse

Du kan returnere et billede som byte [] indpakket i Svarenhed. Forår MVC SvarEnhed muliggør kontrol ikke kun over kroppen af ​​HTTP-svaret, men også overskriften og svarstatuskoden. Efter denne fremgangsmåde skal du definere returtypen for metoden som SvarEnhed og skabe retur SvarEnhed objekt i metodekroppen.

@RequestMapping (værdi = "/ 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 (medier, overskrifter, HttpStatus.OK); return responseEntity; }

Bruger SvarEnhed giver dig mulighed for at konfigurere en svarkode til en given anmodning.

Eksplicit at indstille svarkoden er især nyttig i lyset af en usædvanlig begivenhed, f.eks. hvis billedet ikke blev fundet (FileNotFoundException) eller er beskadiget (IOException). I disse tilfælde er alt, hvad der er brug for, at indstille svarkoden f.eks. ny ResponseEntity (null, headers, HttpStatus.NOT_FOUND), i en passende fangstblok.

Desuden, hvis du har brug for at indstille nogle specifikke overskrifter i dit svar, er denne tilgang mere ligetil end at indstille overskrifter ved hjælp af HttpServletResponse objekt, der accepteres af metoden som en parameter. Det gør metodesignaturen klar og fokuseret.

5. Returbillede ved hjælp af Ressource Klasse

Endelig kan du returnere et billede i form af Ressource objekt.

Det Ressource interface er en grænseflade til abstraktion af adgang til ressourcer på lavt niveau. Det blev introduceret i foråret som en mere dygtig erstatning for standarden java.net.URL klasse. Det giver nem adgang til forskellige typer ressourcer (lokale filer, fjernfiler, klassestieressourcer) uden behov for at skrive en kode, der eksplicit henter dem.

For at anvende denne tilgang skal metoden returnere typen indstilles til Ressource og du skal kommentere metoden med @ResponseBody kommentar.

5.1. Implementering

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

eller hvis vi ønsker mere kontrol over svaroverskrifterne:

@RequestMapping (værdi = "/ billedressource", metode = RequestMethod.GET) @ResponseBody public ResponseEntity getImageAsResource () {HttpHeaders headers = new HttpHeaders (); Ressource ressource = ny ServletContextResource (servletContext, "/WEB-INF/images/image-example.jpg"); returner ny ResponseEntity (ressource, overskrifter, HttpStatus.OK); }

Ved hjælp af denne tilgang behandler du billeder som ressourcer, der kan indlæses ved hjælp af ResourceLoader interface implementering. I et sådant tilfælde trækker du dig fra den nøjagtige placering af dit billede og ResourceLoader beslutter, hvorfra den er indlæst.

Det giver en fælles tilgang til at kontrollere placeringen af ​​billeder ved hjælp af konfigurationen og eliminere behovet for at skrive filindlæsningskode.

6. Konklusion

Blandt de ovennævnte tilgange startede vi fra den grundlæggende tilgang og brugte derefter den tilgang, der drager fordel af rammens meddelelseskonvertering. Vi diskuterede også, hvordan man får indstillet svarkoden og svaroverskrifter uden at aflevere svarobjektet direkte.

Endelig tilføjede vi fleksibilitet set fra billedplaceringens synspunkt, for hvor man kan hente et billede fra defineres i den konfiguration, der er lettere at ændre på farten.

Download et billede eller en fil med Spring forklarer, hvordan man opnår det samme ved hjælp af Spring Boot.

Eksempelkoden efter vejledningen er tilgængelig på GitHub.


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