Prijenos datoteke s Spring MVC

1. Pregled

U prethodnim člancima predstavili smo osnove rukovanja obrascima i istražili biblioteku oznaka obrazaca u Spring MVC-u.

U ovom smo članku usredotočeni na ono za što nudi Proljeće podrška za više dijelova (za prijenos datoteka) u web aplikacijama.

Proljeće nam omogućuje da omogućimo ovu višedijelnu podršku s utikačem MultipartResolver predmeta. Okvir pruža jedan MultipartResolver implementacija za upotrebu sa Commons FileUpload a drugi za upotrebu s Servlet 3.0 višedijelno raščlanjivanje zahtjeva.

Nakon konfiguriranja MultipartResolver vidjet ćemo kako prenijeti jednu datoteku i više datoteka.

Također ćemo se dotaknuti Proljetni čizme.

2. Commons FileUpload

Koristiti CommonsMultipartResolver da bismo se bavili prijenosom datoteke, moramo dodati sljedeću ovisnost:

 commons-fileupload commons-fileupload 1.3.1 

Sada možemo definirati CommonsMultipartResolver grah u našu proljetnu konfiguraciju.

Ovaj MultipartResolver dolazi s nizom postavljen metoda za definiranje svojstava kao što je maksimalna veličina za prijenose:

@Bean (name = "multipartResolver") javni CommonsMultipartResolver multipartResolver () {CommonsMultipartResolver multipartResolver = novi CommonsMultipartResolver (); multipartResolver.setMaxUploadSize (100000); vrati multipartResolver; }

Ovdje moramo kontrolirati različita svojstva CommonsMultipartResolver u samoj definiciji Bean-a.

3. sa Servlet 3.0

Da bi se koristila Servlet 3.0 višedijelno raščlanjivanje, moramo konfigurirati nekoliko dijelova aplikacije. Prvo, moramo postaviti a MultipartConfigElement u našem DispatcherServletregistracija:

javna klasa MainWebAppInitializer implementira WebApplicationInitializer {private String TMP_FOLDER = "/ tmp"; privatno int MAX_UPLOAD_SIZE = 5 * 1024 * 1024; @Override public void onStartup (ServletContext sc) baca ServletException {ServletRegistration.Dynamic appServlet = sc.addServlet ("mvc", novi DispatcherServlet (novi GenericWebApplicationContext ())); appServlet.setLoadOnStartup (1); MultipartConfigElement multipartConfigElement = novi MultipartConfigElement (TMP_FOLDER, MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2); appServlet.setMultipartConfig (multipartConfigElement); }}

U MultipartConfigElement objekta, konfigurirali smo mjesto za pohranu, maksimalnu veličinu pojedinačne datoteke, maksimalnu veličinu zahtjeva (u slučaju više datoteka u jednom zahtjevu) i veličinu pri kojoj se napredak prijenosa datoteke ispire na mjesto za pohranu.

Te se postavke moraju primijeniti na razini registracije servleta, kao Servlet 3.0 ne dopušta im registraciju u MultipartResolver kao što je slučaj sa CommonsMultipartResolver.

Jednom kad se to učini, možemo dodati StandardServletMultipartResolver našoj konfiguraciji Spring:

@Bean public StandardServletMultipartResolver multipartResolver () {return new StandardServletMultipartResolver (); }

4. Prijenos datoteke

Da bismo učitali našu datoteku, možemo izraditi jednostavan obrazac u kojem koristimo HTML ulazni označi sa type = 'datoteka'.

Bez obzira na konfiguraciju rukovanja prijenosom, koju smo odabrali, moramo postaviti atribut kodiranja obrasca na višedijelni / obrasci-podaci. To omogućuje pregledniku da zna kako kodirati obrazac:

Odaberite datoteku za prijenos

Za pohranu učitane datoteke možemo koristiti MultipartFile varijabilna. Ovu varijablu možemo dohvatiti iz parametra zahtjeva unutar metode našeg kontrolera:

@RequestMapping (value = "/ uploadFile", method = RequestMethod.POST) public String submit (@RequestParam ("file") MultipartFile datoteka, ModelMap modelMap) {modelMap.addAttribute ("datoteka", datoteka); vrati "fileUploadView"; } 

The MultipartFile klasa omogućuje pristup pojedinostima o prenesenoj datoteci, uključujući naziv datoteke, vrstu datoteke i tako dalje. Za prikaz ovih podataka možemo koristiti jednostavnu HTML stranicu:

Predana datoteka

OriginalFileName:$ {datoteka.originalFilename}
Tip:$ {file.contentType}

5. Učitavanje Više datoteka

Da bismo prenijeli više datoteka u jedan zahtjev, jednostavno stavimo više polja ulazne datoteke unutar obrasca:

Odaberite datoteku za prijenos
Odaberite datoteku za prijenos
Odaberite datoteku za prijenos

Moramo voditi računa da svako polje za unos ima isto ime kako bi mu se moglo pristupiti kao niz MultipartFile:

@RequestMapping (value = "/ uploadMultiFile", method = RequestMethod.POST) public String submit (@RequestParam ("files") MultipartFile [] files, ModelMap modelMap) {modelMap.addAttribute ("files", files); vrati "fileUploadView"; } 

Sada možemo jednostavno prelaziti preko tog niza za prikaz podataka o datotekama:

   Proljetni prijenos MVC datoteke 

Predani fajlovi

OriginalFileName:$ {file.originalFilename}
Tip:$ {file.contentType}

6. Učitavanje datoteka s dodatnim podacima obrasca

Također možemo poslati dodatne podatke poslužitelju zajedno s datotekom koja se prenosi. Samo moramo u obrazac uvrstiti potrebna polja:

Ime
E-mail
Odaberite datoteku za prijenos

U upravljaču možemo dobiti sve podatke iz obrasca pomoću @RequestParam napomena:

@PostMapping ("/ uploadFileWithAddtionalData") javni String submit (@RequestParam MultipartFile datoteka, @RequestParam String name, @RequestParam String email, ModelMap modelMap) {modelMap.addAttribute ("name", name); modelMap.addAttribute ("e-pošta", e-pošta); modelMap.addAttribute ("datoteka", datoteka); vrati "fileUploadView"; }

Slično prethodnim odjeljcima, HTML stranicu možemo koristiti s JSTL oznake za prikaz informacija.

Također možemo enkapsulirati sva polja obrasca u klasi modela i koristiti ih @ModelAttribute napomena u upravljaču. To bi bilo korisno kada uz datoteku postoji puno dodatnih polja. Pogledajmo kod:

javna klasa FormDataWithFile {naziv privatnog niza; privatni String e-mail; privatna datoteka MultipartFile; // standardni geteri i postavljači}
@PostMapping ("/ uploadFileModelAttribute") javni niz podnošenja (@ModelAttribute FormDataWithFile formDataWithFile, ModelMap modelMap) {modelMap.addAttribute ("formDataWithFile", formDataWithFile); vrati "fileUploadView"; }

7. Proljetni prijenos datoteke za pokretanje

Ako koristimo Spring Boot, sve što smo do sada vidjeli i dalje vrijedi.

Međutim, Spring Boot olakšava konfiguriranje i pokretanje svega uz malo muke.

Posebno, nije potrebno konfigurirati bilo koji servlet, kako će ga Boot registrirati i konfigurirati za nas, pod uvjetom da web modul uključimo u naše ovisnosti:

 org.springframework.boot spring-boot-starter-web 2.1.8.OSLOBODI 

Možemo pronaći najnoviju verziju proljeće-boot-starter-web na Maven Central.

Ako želimo kontrolirati maksimalnu veličinu za prijenos datoteka, možemo urediti svoj primjena.svojstva:

spring.servlet.multipart.max-file-size = 128KB spring.servlet.multipart.max-request-size = 128KB

Također možemo kontrolirati je li omogućen prijenos datoteka i mjesto za prijenos datoteka:

spring.servlet.multipart.enabled = true spring.servlet.multipart.location = $ {java.io.tmpdir}

Imajte na umu da smo koristili $ {java.io.tmpdir} da definiramo mjesto prijenosa kako bismo privremeno mjesto mogli koristiti za različite operativne sustave.

8. Zaključak

U ovom smo članku pregledali različite načine konfiguriranja podrške za više dijelova u proljeće. Pomoću njih možemo podržati prijenos datoteka u našim web aplikacijama.

Provedbu ovog vodiča možete pronaći u projektu GitHub. Kada se projekt izvodi lokalno, primjeru obrasca može se pristupiti na // localhost: 8080 / spring-mvc-java / fileUpload