Nahrávanie súborov pomocou Spring MVC
1. Prehľad
V predchádzajúcich článkoch sme predstavili základy manipulácie s formulármi a preskúmali sme knižnicu značiek formulárov v Spring MVC.
V tomto článku sa zameriavame na to, čo ponúka jar podpora viacerých častí (nahrávanie súborov) vo webových aplikáciách.
Jar nám umožňuje povoliť túto viacdielnu podporu s možnosťou zapojenia MultipartResolver predmety. Rámec poskytuje jednu MultipartResolver implementácia pre použitie s Commons FileUpload a ďalší na použitie s Servlet 3.0 analýza viacerých častí.
Po nakonfigurovaní MultipartResolver uvidíme, ako nahrať jeden súbor a viac súborov.
Dotkneme sa tiež Jarná topánka.
2. Commons FileUpload
Použit CommonsMultipartResolver na spracovanie nahrávania súborov musíme pridať nasledujúcu závislosť:
commons-fileupload commons-fileupload 1.3.1
Teraz môžeme definovať CommonsMultipartResolver fazuľa do našej jarnej konfigurácie.
Toto MultipartResolver prichádza s radom nastaviť metóda definovania vlastností, ako je maximálna veľkosť nahrávaných súborov:
@Bean (name = "multipartResolver") public CommonsMultipartResolver multipartResolver () {CommonsMultipartResolver multipartResolver = nový CommonsMultipartResolver (); multipartResolver.setMaxUploadSize (100000); návrat multipartResolver; }
Tu musíme ovládať rôzne vlastnosti CommonsMultipartResolver v samotnej Beanovej definícii.
3. S Servlet 3.0
Aby bolo možné použiť Servlet 3.0 syntaktická analýza viacerých častí, musíme nakonfigurovať niekoľko častí aplikácie. Najskôr musíme nastaviť a MultipartConfigElement v našom DispatcherServletregistrácia:
verejná trieda MainWebAppInitializer implementuje WebApplicationInitializer {súkromný reťazec TMP_FOLDER = "/ tmp"; private int MAX_UPLOAD_SIZE = 5 * 1024 * 1024; @Override public void onStartup (ServletContext sc) hodí ServletException {ServletRegistration.Dynamic appServlet = sc.addServlet ("mvc", nový DispatcherServlet (nový GenericWebApplicationContext ())); appServlet.setLoadOnStartup (1); MultipartConfigElement multipartConfigElement = nový MultipartConfigElement (TMP_FOLDER, MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2); appServlet.setMultipartConfig (multipartConfigElement); }}
V MultipartConfigElement objektu, nakonfigurovali sme umiestnenie úložiska, maximálnu veľkosť individuálneho súboru, maximálnu veľkosť požiadavky (v prípade viacerých súborov v jednej požiadavke) a veľkosť, v ktorej je priebeh nahrávania súborov vyprázdnený do úložného miesta.
Tieto nastavenia musia byť použité na úrovni registrácie servletu, ako Servlet 3.0 neumožňuje ich registráciu v MultipartResolver ako je to v prípade CommonsMultipartResolver.
Akonáhle je to hotové, môžeme pridať StandardServletMultipartResolver do našej jarnej konfigurácie:
@Bean public StandardServletMultipartResolver multipartResolver () {vrátiť nový StandardServletMultipartResolver (); }
4. Odovzdanie súboru
Na nahranie nášho súboru môžeme vytvoriť jednoduchú formu, v ktorej používame HTML vstup označiť pomocou type = 'súbor'.
Bez ohľadu na konfiguráciu spracovania nahrávania, ktorú sme vybrali, je potrebné nastaviť atribút kódovania formulára na multipart / form-data. Toto umožní prehliadaču vedieť, ako kódovať formulár:
Vyberte súbor, ktorý chcete nahrať
Na uloženie nahraného súboru môžeme použiť a MultipartFile premenná. Túto premennú môžeme načítať z parametra požiadavky vo vnútri metódy nášho kontrolóra:
@RequestMapping (value = "/ uploadFile", method = RequestMethod.POST) public String submit (@RequestParam ("file") súbor MultipartFile, ModelMap modelMap) {modelMap.addAttribute ("súbor", súbor); vrátiť "fileUploadView"; }
The MultipartFile trieda poskytuje prístup k podrobnostiam o nahranom súbore, vrátane názvu súboru, typu súboru atď. Na zobrazenie týchto informácií môžeme použiť jednoduchú stránku HTML:
Odoslaný súbor
OriginalFileName: $ {file.originalFilename} Typ: $ {file.contentType}
5. Nahrávanie Viac súborov
Ak chcete nahrať viac súborov v jednej žiadosti, jednoducho vo formulári vložíte viac polí vstupných súborov:
Vyberte súbor, ktorý chcete nahrať Vyberte súbor, ktorý chcete nahrať Vyberte súbor, ktorý chcete nahrať
Musíme sa postarať o to, aby každé vstupné pole malo rovnaký názov, aby k nemu bolo možné získať prístup ako k súboru MultipartFile:
@RequestMapping (value = "/ uploadMultiFile", method = RequestMethod.POST) public String submit (@RequestParam ("files") MultipartFile [] súbory, ModelMap modelMap) {modelMap.addAttribute ("súbory", súbory); vrátiť "fileUploadView"; }
Teraz môžeme toto pole jednoducho iterovať, aby sme zobrazili informácie o súboroch:
Jarné nahrávanie súborov MVC Odoslané súbory
OriginalFileName: $ {file.originalFilename} Typ: $ {file.contentType}
6. Načítanie súborov s ďalšími údajmi formulára
Spolu s nahrávaným súborom môžeme na server odoslať aj ďalšie informácie. Musíme len zahrnúť povinné polia do formulára:
názov Email Vyberte súbor, ktorý chcete nahrať
V radiči môžeme všetky údaje formulára získať pomocou @RequestParam anotácia:
@PostMapping ("/ uploadFileWithAddtionalData") verejný reťazec odoslať (súbor @RequestParam MultipartFile, názov reťazca @RequestParam, e-mail reťazca @RequestParam, ModelMap modelMap) {modelMap.addAttribute ("name", meno); modelMap.addAttribute ("e-mail", e-mail); modelMap.addAttribute ("súbor", súbor); vrátiť "fileUploadView"; }
Podobne ako v predchádzajúcich častiach, môžeme stránku HTML použiť s JSTL značky na zobrazenie informácií.
Môžeme tiež zapuzdriť všetky polia formulára v triede modelu a použiť ich @ModelAttribute anotácia v radiči. To by bolo užitočné, keď je k súboru veľa ďalších polí. Pozrime sa na kód:
public class FormDataWithFile {private String name; súkromný reťazcový e-mail; súkromný súbor MultipartFile; // štandardné getre a setre}
@PostMapping ("/ uploadFileModelAttribute") public String submit (@ModelAttribute FormDataWithFile formDataWithFile, ModelMap modelMap) {modelMap.addAttribute ("formDataWithFile", formDataWithFile); vrátiť "fileUploadView"; }
7. Spring Boot File Upload
Pokiaľ používame Spring Boot, stále platí všetko, čo sme doteraz videli.
Spring Boot však ešte viac uľahčuje konfiguráciu a začatie všetkého s malými problémami.
Najmä nie je potrebné konfigurovať žiadny servlet, pretože Boot nás zaregistruje a nakonfiguruje za predpokladu, že do svojich závislostí zahrnieme aj webový modul:
org.springframework.boot spring-boot-starter-web 2.1.8.RELEASE
Nájdeme najnovšiu verziu servera spring-boot-starter-web na Maven Central.
Ak chceme ovládať maximálnu veľkosť nahrávaného súboru, môžeme upraviť našu application.properties:
spring.servlet.multipart.max-file-size = 128 kB spring.servlet.multipart.max-request-size = 128 kB
Môžeme tiež ovládať, či je povolené nahrávanie súborov, a umiestnenie nahrávania súborov:
spring.servlet.multipart.enabled = skutočná spring.servlet.multipart.location = $ {java.io.tmpdir}
Všimnite si, že sme to použili $ {java.io.tmpdir} definovať umiestnenie nahrávania, aby sme mohli použiť dočasné umiestnenie pre rôzne operačné systémy.
8. Záver
V tomto článku sme sa zaoberali rôznymi spôsobmi konfigurácie podpory viacerých častí na jar. Pomocou nich môžeme podporovať nahrávanie súborov v našich webových aplikáciách.
Implementáciu tohto tutoriálu nájdete v projekte GitHub. Keď projekt beží lokálne, k príkladu formulára sa dá dostať na // localhost: 8080 / spring-mvc-java / fileUpload