Kép- / médiaadatok visszaküldése tavaszi MVC-vel

1. Áttekintés

Ebben az oktatóanyagban bemutatjuk, hogyan lehet a Spring MVC keretrendszer segítségével visszaküldeni a képeket és más adathordozókat.

Számos megközelítést fogunk megvitatni, a közvetlen manipulációtól kezdve HttpServletResponse mint az üzenetek konvertálása, a tartalmi tárgyalások és a tavasz előnyös megközelítései felé haladni Forrás absztrakció. Közelebbről megvizsgáljuk mindegyiket, és megvitatjuk előnyeiket és hátrányaikat.

2. A HttpServletResponse

A képletöltés legalapvetőbb megközelítése az, ha közvetlenül a válasz objektumot és utánoz egy tiszta Servlet megvalósítását, és a következő kódrészlet segítségével mutatják be:

A @RequestMapping (value = "/ image-manual-response", method = RequestMethod.GET) public void getImageAsByteArray (HttpServletResponse response) IOException dobja az "); response.setContentType (MediaType.IMAGE_JPEG_VALUE); IOUtils.copy (in, response.getOutputStream ()); }

A következő kérelem kiadásával a kép megjelenik egy böngészőben:

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

A megvalósítás meglehetősen egyszerű és egyszerű IOUtils tól org.apache.commons.io csomag. A megközelítés hátránya azonban, hogy nem robusztus a lehetséges változásokkal szemben. A mime típus kemény kódolású, és az átalakítási logika megváltoztatása vagy a kép helyének külsővé tétele megköveteli a kód megváltoztatását.

A következő szakasz a rugalmasabb megközelítést tárgyalja.

3. A HttpMessageConverter

Az előző szakasz egy olyan alapvető megközelítést tárgyalt, amely nem használja ki a Spring MVC Framework üzenetkonverziós és tartalmi tárgyalási szolgáltatásainak előnyeit. Ezeknek a szolgáltatásoknak a rendszerindításához szükségünk van:

  • Jegyezze fel a vezérlő módszerét a @ResponseBody annotáció
  • Regisztráljon egy megfelelő üzenetátalakítót a vezérlő módszer visszatérési típusa alapján (ByteArrayHttpMessageConverter például a bájt tömb képfájlba történő megfelelő átalakításához szükséges)

3.1. Konfiguráció

A konverterek konfigurációjának bemutatásához a beépítettet fogjuk használni ByteArrayHttpMessageConverter amely konvertál egy üzenetet, valahányszor egy metódus visszaadja byte[] típus.

A ByteArrayHttpMessageConverter alapértelmezés szerint regisztrálva van, de a konfiguráció hasonló bármely más beépített vagy egyedi átalakítóhoz.

Az üzenet-átalakító komponens alkalmazásához megfelelő regisztráció szükséges MessageConverter bab a Spring MVC kontextusban, és olyan médiatípusok beállítása, amelyeket kezelnie kell. XML-en keresztül definiálhatja címke.

Ezt a címkét belül kell definiálni címke, például a következő példában:

     kép / jpeg kép / png 

A fent említett konfigurációs rész regisztrálódik ByteArrayHttpMessageConverter mert kép / JPEG és kép / png válasz tartalomtípusok. Ha címke nincs az mvc konfigurációjában, akkor az átalakítók alapértelmezett készlete regisztrálásra kerül.

Ezenkívül regisztrálhatja az üzenetátalakítót Java konfigurációval:

@Orride public void configureMessageConverters (List konverterek) {converters.add (byteArrayHttpMessageConverter ()); } @Bean public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter () {ByteArrayHttpMessageConverter tömbHttpMessageConverter = új ByteArrayHttpMessageConverter (); arrayHttpMessageConverter.setSupportedMediaTypes (getSupportedMediaTypes ()); return arrayHttpMessageConverter; } private list getSupportedMediaTypes () {List list = new ArrayList (); list.add (MediaType.IMAGE_JPEG); list.add (MediaType.IMAGE_PNG); list.add (MediaType.APPLICATION_OCTET_STREAM); visszatérési lista; }

3.2. Végrehajtás

Most már megvalósíthatjuk a média kéréseket kezelő módszerünket. Mint fent említettük, meg kell jelölnie a vezérlő metódusát a @ResponseBody annotáció és használat byte[] mint visszatérő típus:

@RequestMapping (value = "/ image-byte-array", method = RequestMethod.GET) public @ResponseBody byte [] getImageAsByteArray () dobja az IOException {InputStream be = servletContext.getResourceAsStream ("/ WEB-INF / images / image-example-példa .jpg "); return IOUtils.toByteArray (in); }

A módszer teszteléséhez adja ki a következő kérést a böngészőben:

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

Előnyös, hogy a módszer nem tud semmit a HttpServletResponse, az átalakítási folyamat nagyon konfigurálható, kezdve a rendelkezésre álló átalakítók használatától az egyedi megadásáig. A válasz tartalmi típusát nem kell kemény kódolással ellátni, inkább a kérési út utótag alapján egyeztetjük .jpg.

Ennek a megközelítésnek az a hátránya, hogy kifejezetten meg kell valósítania a kép adatforrásból történő visszakeresésének logikáját (helyi fájl, külső tároló stb.), És nem tudja ellenőrizni a fejléceket vagy a válasz állapotkódját.

4. A ResponseEntity Osztály

Visszaadhat egy képet byte[] bebugyolálva a Válasz entitás. Tavaszi MVC ResponseEntity nemcsak a HTTP-válasz törzsének, hanem a fejlécnek és a válaszállapot-kódnak a vezérlését is lehetővé teszi. Ezt a megközelítést követve meg kell határoznia a metódus visszatérési típusát ResponseEntity és hozzon létre visszatérő ResponseEntity objektum a módszer törzsében.

@RequestMapping (value = "/ image-response-entitás", method = RequestMethod.GET) public ResponseEntity getImageAsResponseEntity () {HttpHeaders headers = new HttpHeaders (); InputStream in = servletContext.getResourceAsStream ("/ WEB-INF / images / image-example.jpg"); bájt [] adathordozó = IOUtils.toByteArray (in); fejlécek.setCacheControl (CacheControl.noCache (). getHeaderValue ()); ResponseEntity responseEntity = új ResponseEntity (adathordozó, fejlécek, HttpStatus.OK); return responseEntity; }

Használni a ResponseEntity lehetővé teszi egy válaszkód konfigurálását egy adott kéréshez.

A válaszkód kifejezett beállítása különösen hasznos egy kivételes esemény esetén, pl. ha a kép nem található (FileNotFoundException) vagy sérült (IOException). Ezekben az esetekben csak a válaszkód beállítására van szükség pl. új ResponseEntity (null, fejlécek, HttpStatus.NOT_FOUND), megfelelő fogási blokkban.

Ezenkívül, ha válaszában meg kell adnia bizonyos fejléceket, ez a megközelítés egyszerűbb, mint a fejlécek HttpServletResponse objektum, amelyet a metódus paraméterként elfogad. Világossá és fókuszálttá teszi a módszer aláírását.

5. Visszatérő kép a Forrás Osztály

Végül visszaadhat egy képet a Forrás tárgy.

A Forrás interfész egy felület az alacsony szintű erőforrásokhoz való hozzáférés elvonatkoztatásához. Tavasszal mutatkozik be, mint a szabvány képesebb helyettesítője java.net.URL osztály. Könnyű hozzáférést biztosít a különböző típusú erőforrásokhoz (helyi fájlok, távoli fájlok, classpath erőforrások) anélkül, hogy olyan kódot kellene írni, amely kifejezetten lekéri őket.

Ennek a megközelítésnek a használatához a metódus visszatérési típusát be kell állítani Forrás és meg kell jegyeznie a módszert a @ResponseBody annotáció.

5.1. Végrehajtás

@ResponseBody @RequestMapping (érték = "/ image-resource", method = RequestMethod.GET) nyilvános erőforrás getImageAsResource () {return new ServletContextResource (servletContext, "/WEB-INF/images/image-example.jpg"); }

vagy ha jobban szeretnénk ellenőrizni a válaszfejléceket:

@RequestMapping (value = "/ image-resource", method = RequestMethod.GET) @ResponseBody public ResponseEntity getImageAsResource () {HttpHeaders headers = new HttpHeaders (); Erőforrás = új ServletContextResource (servletContext, "/WEB-INF/images/image-example.jpg"); return new ResponseEntity (erőforrás, fejlécek, HttpStatus.OK); }

Ezzel a megközelítéssel a képeket erőforrásként kezeli, amelyek a ResourceLoader interfész megvalósítása. Ebben az esetben elvonatkoztat a kép pontos helyétől és ResourceLoader honnan tölti be.

Közös megközelítést biztosít a képek helyének a konfiguráció segítségével történő vezérléséhez, és feleslegessé teszi a fájl betöltési kód írását.

6. Következtetés

A fent említett megközelítések közül az alap megközelítésből indultunk ki, majd azt a megközelítést alkalmaztuk, amelynek előnyei vannak a keretrendszer üzenetkonverziós jellemzőjének. Megbeszéltük azt is, hogyan lehet a beállított válaszkódot és válaszfejléceket beszerezni a válaszobjektum közvetlen átadása nélkül.

Végül hozzáadtuk a rugalmasságot a kép helyszíne szempontjából, mert ahonnan képet lehet letölteni, azt a konfiguráció határozza meg, amelyet menet közben könnyebb megváltoztatni.

Kép vagy fájl letöltése a Spring segítségével elmagyarázza, hogyan érhető el ugyanaz a dolog a Spring Boot használatával.

Az oktatóanyagot követő mintakód a GitHub oldalon érhető el.


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