Vraćanje podataka o slikama / medijima s Spring MVC

1. Pregled

U ovom uputstvu ilustrirat ćemo kako vratiti slike i druge medije pomoću Spring MVC okvira.

Razgovarat ćemo o nekoliko pristupa, počevši od izravnog manipuliranja HttpServletResponse nego prijelaz na pristupe koji imaju koristi od pretvorbe poruka, pregovora o sadržaju i Spring-a Resurs apstrakcija. Pobliže ćemo pogledati svakog od njih i razgovarati o njihovim prednostima i nedostacima.

2. Korištenje HttpServletResponse

Najosnovniji pristup preuzimanja slike je izravno raditi protiv a odgovor objekt i oponašaju čisti Servlet implementacija, a prikazana je pomoću sljedećeg isječka:

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

Izdavanjem sljedećeg zahtjeva slika će se prikazati u pregledniku:

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

Implementacija je zahvaljujući tome prilično jednostavna i jednostavna IOUtils od org.apache.commons.io paket. Međutim, nedostatak je pristupa što nije robustan u odnosu na potencijalne promjene. Tip mima je teško kodiran, a promjena logike pretvorbe ili eksternalizacija mjesta slike zahtijevaju promjene koda.

Sljedeći odjeljak govori o fleksibilnijem pristupu.

3. Korištenje HttpMessageConverter

Prethodni odjeljak raspravljao je o osnovnom pristupu koji ne koristi prednosti pretvorbe poruka i pregovora o sadržaju Spring MVC Framework-a. Za pokretanje ovih značajki trebamo:

  • Označite metodu kontrolera znakom @ResponseBody bilješka
  • Registrirajte odgovarajući pretvarač poruka na temelju vrste povratka metode kontrolera (ByteArrayHttpMessageConverter na primjer potreban za ispravnu pretvorbu bajt polja u slikovnu datoteku)

3.1. Konfiguracija

Za prikaz konfiguracije pretvarača poslužit ćemo ugrađenim ByteArrayHttpMessageConverter koja pretvara poruku kad god metoda vrati bajt[] tip.

The ByteArrayHttpMessageConverter je registriran prema zadanim postavkama, ali konfiguracija je analogna za bilo koji drugi ugrađeni ili prilagođeni pretvarač.

Primjena graha pretvarača poruka zahtijeva registraciju odgovarajućeg Pretvarač poruka bean unutar Spring MVC konteksta i postavljanje vrsta medija s kojima bi se trebao nositi. Možete ga definirati putem XML-a pomoću označiti.

Ovu oznaku treba definirati iznutra oznaka, kao u sljedećem primjeru:

     slika / jpeg slika / png 

Spomenuti konfiguracijski dio registrirat će se ByteArrayHttpMessageConverter za slika / jpeg i slika / png vrste sadržaja odgovora. Ako tag nije prisutan u mvc konfiguraciji, tada će se registrirati zadani skup pretvarača.

Također, možete registrirati pretvarač poruka pomoću Java konfiguracije:

@Override public void configureMessageConverters (Popis pretvarači) {converters.add (byteArrayHttpMessageConverter ()); } @Bean public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter () {ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter (); arrayHttpMessageConverter.setSupportedMediaTypes (getSupportedMediaTypes ()); vrati arrayHttpMessageConverter; } privatni popis getSupportedMediaTypes () {Popis popisa = novi ArrayList (); list.add (MediaType.IMAGE_JPEG); list.add (MediaType.IMAGE_PNG); list.add (MediaType.APPLICATION_OCTET_STREAM); popis za povratak; }

3.2. Provedba

Sada možemo implementirati našu metodu koja će obrađivati ​​zahtjeve za medije. Kao što je gore spomenuto, morate svoj način kontrolera označiti znakom @ResponseBody napomena i upotreba bajt[] kao povratni tip:

@RequestMapping (value = "/ image-byte-array", method = RequestMethod.GET) public @ResponseBody byte [] getImageAsByteArray () baca IOException {InputStream in = servletContext.getResourceAsStream ("/ WEB-image-INF (/ / WEB-image-INF (/ / WEB-image-INF .jpg "); vrati IOUtils.toByteArray (u); }

Da biste testirali metodu, u pregledniku izdajte sljedeći zahtjev:

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

Što se tiče prednosti, metoda ne zna ništa o HttpServletResponse, postupak pretvorbe je vrlo konfigurabilan, u rasponu od korištenja dostupnih pretvarača do specificiranja prilagođenog. Vrsta sadržaja odgovora ne mora biti teško kodirana, već će se pregovarati na temelju sufiksa puta zahtjeva .jpg.

Nedostatak ovog pristupa je taj što morate izričito implementirati logiku za dohvaćanje slike iz izvora podataka (lokalna datoteka, vanjska pohrana itd.) I nemate kontrolu nad zaglavljima ili statusnim kodom odgovora.

4. Korištenje ResponseEntity Razred

Sliku možete vratiti kao bajt[] zamotan u Subjekt odgovora. Proljetni MVC ResponseEntity omogućuje kontrolu ne samo nad tijelom HTTP odgovora već i zaglavljem i kodom statusa odgovora. Slijedeći ovaj pristup, trebate definirati vrstu povrata metode kao ResponseEntity i stvoriti povratak ResponseEntity objekt u tijelu metode.

@RequestMapping (value = "/ image-response-entity", method = RequestMethod.GET) javni ResponseEntity getImageAsResponseEntity () {HttpHeaders headers = new HttpHeaders (); InputStream u = servletContext.getResourceAsStream ("/ WEB-INF / images / image-example.jpg"); bajt [] media = IOUtils.toByteArray (in); headers.setCacheControl (CacheControl.noCache (). getHeaderValue ()); ResponseEntity responseEntity = novi ResponseEntity (mediji, zaglavlja, HttpStatus.OK); return responseEntity; }

Koristiti ResponseEntity omogućuje vam konfiguriranje koda odgovora za zadani zahtjev.

Eksplicitno postavljanje koda odgovora posebno je korisno u slučaju iznimnog događaja, npr. ako slika nije pronađena (FileNotFoundException) ili je oštećen (IOException). U tim je slučajevima potrebno samo postaviti kod odgovora, na pr. novi ResponseEntity (null, zaglavlja, HttpStatus.NOT_FOUND), u odgovarajućem bloku za ulov.

Osim toga, ako trebate postaviti neka specifična zaglavlja u svom odgovoru, ovaj je pristup jednostavniji od postavljanja zaglavlja pomoću HttpServletResponse objekt koji metoda prihvaća kao parametar. To čini potpis metode jasnim i fokusiranim.

5. Vraćanje slike pomoću Resurs Razred

Napokon, možete vratiti sliku u obliku Resurs objekt.

The Resurs sučelje je sučelje za apstrahiranje pristupa resursima niske razine. Predstavljen je na proljeće kao sposobnija zamjena za standard java.net.URL razred. Omogućuje jednostavan pristup različitim vrstama resursa (lokalnim datotekama, udaljenim datotekama, resursima putova do klase) bez potrebe za pisanjem koda koji ih eksplicitno preuzima.

Da biste koristili ovaj pristup, treba postaviti vrstu povrata metode Resurs a metodu morate označiti znakom @ResponseBody bilješka.

5.1. Provedba

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

ili, ako želimo veću kontrolu nad zaglavljima odgovora:

@RequestMapping (value = "/ image-resource", method = RequestMethod.GET) @ResponseBody public ResponseEntity getImageAsResource () {HttpHeaders headers = new HttpHeaders (); Resurs resursa = novi ServletContextResource (servletContext, "/WEB-INF/images/image-example.jpg"); vratiti novi ResponseEntity (resurs, zaglavlja, HttpStatus.OK); }

Korištenjem ovog pristupa tretirate slike kao resurse koji se mogu učitati pomoću ResourceLoader implementacija sučelja. U tom se slučaju apstrahirate s točnog mjesta na kojoj se nalazi vaša slika i ResourceLoader odlučuje odakle je učitan.

Pruža uobičajeni pristup kontroli položaja slika pomoću konfiguracije i uklanja potrebu za pisanjem koda za učitavanje datoteka.

6. Zaključak

Među gore spomenutim pristupima, krenuli smo od osnovnog pristupa, a zatim koristeći pristup koji koristi značajku pretvorbe poruka u okviru. Također smo razgovarali o tome kako dobiti skup koda odgovora i zaglavlja odgovora bez izravne predaje objekta odgovora.

Konačno, dodali smo fleksibilnost s gledišta mjesta slike, jer gdje se dohvaća slika definirano je u konfiguraciji koju je lakše promijeniti u hodu.

Preuzimanje slike ili datoteke s Springom objašnjava kako postići istu stvar pomoću Spring Boot-a.

Uzorak koda nakon vodiča dostupan je na GitHubu.


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