Vrátenie obrazových / mediálnych údajov s jarným MVC

1. Prehľad

V tomto tutoriáli si ukážeme, ako vrátiť obrázky a ďalšie médiá pomocou rámca Spring MVC.

Budeme diskutovať o niekoľkých prístupoch, počnúc priamou manipuláciou HttpServletResponse než prejsť k prístupom, ktoré profitujú z konverzie správ, vyjednávania obsahu a jari Zdroj abstrakcia. Každému z nich sa bližšie pozrieme a prediskutujeme jeho výhody a nevýhody.

2. Pomocou HttpServletResponse

Najzákladnejším prístupom k sťahovaniu obrázkov je priama práca proti a odpoveď objekt a napodobňujú čistý Servlet implementáciu a demonštruje ju pomocou nasledujúceho úryvku:

@RequestMapping (value = "/ image-manual-response", method = RequestMethod.GET) public void getImageAsByteArray (odpoveď HttpServletResponse) vyvolá IOException {InputStream in = servletContext.getResourceAsStream ("/ WEB-INF / images / image-example.jpg" "); response.setContentType (MediaType.IMAGE_JPEG_VALUE); IOUtils.copy (v, response.getOutputStream ()); }

Zadaním nasledujúcej žiadosti sa obrázok vykreslí v prehliadači:

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

Implementácia je pomerne jednoduchá a jednoduchá IOUtils z org.apache.commons.io balíček. Nevýhodou prístupu však je, že nie je odolný voči potenciálnym zmenám. Typ MIME je pevne zakódovaný a zmena logiky prevodu alebo externalizácia umiestnenia obrázka si vyžaduje zmeny kódu.

V nasledujúcej časti sa hovorí o flexibilnejšom prístupe.

3. Pomocou HttpMessageConverter

V predchádzajúcej časti sa diskutovalo o základnom prístupe, ktorý nevyužíva výhody konverzných správ a vyjednávania obsahu v rámci jarného MVC rámca. Ak chcete zaviesť tieto funkcie, musíme:

  • Metódu radiča anotujte pomocou @ResponseBody anotácia
  • Zaregistrujte vhodný prevádzač správ na základe návratového typu metódy radiča (ByteArrayHttpMessageConverter potrebné napríklad pre správny prevod bajtového poľa na obrazový súbor)

3.1. Konfigurácia

Na predstavenie konfigurácie prevodníkov použijeme zabudovaný modul ByteArrayHttpMessageConverter ktorá prevádza správu vždy, keď metóda vráti byte [] typu.

The ByteArrayHttpMessageConverter je predvolene zaregistrovaný, ale konfigurácia je analogická pre akýkoľvek iný vstavaný alebo prispôsobený prevodník.

Aplikácia fazule prevádzača správ si vyžaduje príslušnú registráciu MessageConverter bean vo vnútri kontextu Spring MVC a nastavovanie typov médií, ktoré by mal spracovávať. Môžete ho definovať pomocou XML pomocou značka.

Táto značka by mala byť definovaná vo vnútri značka, ako v nasledujúcom príklade:

     obrázok / jpeg obrázok / png 

Vyššie uvedená konfiguračná časť sa zaregistruje ByteArrayHttpMessageConverter pre obrázok / jpeg a obrázok / png typy obsahu odpovede. Ak značka nie je prítomná v konfigurácii mvc, potom bude zaregistrovaná predvolená sada prevádzačov.

Môžete tiež zaregistrovať prevádzač správ pomocou konfigurácie Java:

@ Override public void configureMessageConverters (zoznam prevádzače) {converterters.add (byteArrayHttpMessageConverter ()); } @Bean public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter () {ByteArrayHttpMessageConverter arrayHttpMessageConverter = nový ByteArrayHttpMessageConverter (); arrayHttpMessageConverter.setSupportedMediaTypes (getSupportedMediaTypes ()); návratové poleHttpMessageConverter; } private List getSupportedMediaTypes () {List list = new ArrayList (); list.add (MediaType.IMAGE_JPEG); list.add (MediaType.IMAGE_PNG); list.add (MediaType.APPLICATION_OCTET_STREAM); návratový zoznam; }

3.2. Implementácia

Teraz môžeme implementovať našu metódu, ktorá bude vybavovať požiadavky na médiá. Ako už bolo spomenuté vyššie, musíte metódu ovládača označiť znakom @ResponseBody anotáciu a použitie byte [] ako vracajúci sa typ:

@RequestMapping (value = "/ image-byte-array", method = RequestMethod.GET) public @ResponseBody byte [] getImageAsByteArray () hodí IOException {InputStream in = servletContext.getResourceAsStream ("/ WEB-INF / obrázky / obrázok-príklad) .jpg "); vrátiť IOUtils.toByteArray (v); }

Ak chcete túto metódu otestovať, zadajte vo svojom prehliadači nasledujúcu požiadavku:

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

Výhodou je, že metóda nevie nič o HttpServletResponse, proces premeny je vysoko konfigurovateľný, od použitia dostupných prevádzačov po zadanie vlastného. Typ obsahu odpovede nemusí byť napevno, bude sa vyjednávať na základe prípony cesty požiadavky .jpg.

Nevýhodou tohto prístupu je, že musíte explicitne implementovať logiku načítania obrázka zo zdroja údajov (lokálny súbor, externé úložisko atď.) A nemáte kontrolu nad hlavičkami ani stavovým kódom odpovede.

4. Pomocou ResponseEntity Trieda

Môžete vrátiť obrázok ako byte [] zabalené v Subjekt odpovede. Jarné MVC ResponseEntity umožňuje kontrolu nielen nad telom odpovede HTTP, ale aj nad hlavičkou a stavovým kódom odpovede. Podľa tohto prístupu musíte definovať návratový typ metódy ako ResponseEntity a vytvoriť návrat ResponseEntity objekt v tele metódy.

@RequestMapping (value = "/ image-response-entity", method = RequestMethod.GET) public ResponseEntity getImageAsResponseEntity () {hlavičky HttpHeaders = nové HttpHeaders (); InputStream in = servletContext.getResourceAsStream ("/ WEB-INF / images / image-example.jpg"); byte [] médiá = IOUtils.toByteArray (v); headers.setCacheControl (CacheControl.noCache (). getHeaderValue ()); ResponseEntity responseEntity = new ResponseEntity (médiá, hlavičky, HttpStatus.OK); návratová odpoveďEntita; }

Pomocou ResponseEntity umožňuje konfigurovať kód odpovede pre danú požiadavku.

Explicitné nastavenie kódu odpovede je užitočné najmä v prípade výnimočnej udalosti, napr. ak sa obrázok nenašiel (FileNotFoundException) alebo je poškodený (IOException). V týchto prípadoch je potrebné iba nastavenie kódu odpovede, napr. new ResponseEntity (null, headers, HttpStatus.NOT_FOUND), v adekvátnom úlovkovom bloku.

Okrem toho, ak potrebujete vo svojej odpovedi nastaviť niektoré konkrétne hlavičky, je tento prístup priamočiarejší ako nastavenie hlavičiek pomocou HttpServletResponse objekt, ktorý je metódou akceptovaný ako parameter. Vďaka tomu je podpis metódy jasný a zameraný.

5. Vrátenie obrázka pomocou Zdroj Trieda

Na záver môžete vrátiť obrázok vo forme súboru Zdroj objekt.

The Zdroj interface je rozhranie na abstrahovanie prístupu k zdrojom na nízkej úrovni. Predstavuje sa na jar ako schopnejšia náhrada za štandard java.net.URL trieda. Umožňuje ľahký prístup k rôznym typom zdrojov (miestne súbory, vzdialené súbory, prostriedky triedy Classpath) bez nutnosti písania kódu, ktorý ich explicitne načítava.

Ak chcete použiť tento prístup, mal by byť nastavený návratový typ metódy Zdroj a musíte metódu anotovať pomocou @ResponseBody anotácia.

5.1. Implementácia

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

alebo, ak chceme mať väčšiu kontrolu nad hlavičkami odpovedí:

@RequestMapping (value = "/ image-resource", method = RequestMethod.GET) @ResponseBody public ResponseEntity getImageAsResource () {HttpHeaders headers = new HttpHeaders (); Zdroj zdrojov = nový ServletContextResource (servletContext, "/WEB-INF/images/image-example.jpg"); vrátiť novú ResponseEntity (zdroj, hlavičky, HttpStatus.OK); }

Pomocou tohto prístupu považujete obrázky za prostriedky, ktoré je možné načítať pomocou nástroja ResourceLoader implementácia rozhrania. V takom prípade abstrahujete od presného umiestnenia vášho obrázka a ResourceLoader rozhodne, odkiaľ je načítaný.

Poskytuje spoločný prístup k riadeniu umiestnenia obrázkov pomocou konfigurácie a eliminuje potrebu písania kódu na načítanie súborov.

6. Záver

Spomedzi vyššie spomenutých prístupov sme vychádzali zo základného prístupu, potom sme použili prístup, ktorý ťaží z funkcie konverzie správ v rámci. Diskutovali sme tiež o tom, ako získať sadu kódu odpovede a hlavičky odpovedí bez priameho odovzdania objektu odpovede.

Nakoniec sme pridali flexibilitu z pohľadu umiestnenia obrázkov, pretože odkiaľ sa má obrázok načítať, je definované v konfigurácii, ktorú je možné za chodu ľahšie meniť.

Stiahnutie obrázka alebo súboru pomocou pružiny vysvetľuje, ako pomocou Spring Boot dosiahnuť to isté.

Ukážkový kód nasledujúci po tejto príručke je k dispozícii na GitHub.


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