Filopplasting med Spring MVC

1. Oversikt

I tidligere artikler introduserte vi det grunnleggende om skjemahåndtering og utforsket skjemaet tagbiblioteket i Spring MVC.

I denne artikkelen fokuserer vi på hva Spring tilbyr flerdelt (filopplasting) støtte i webapplikasjoner.

Våren lar oss aktivere denne flerdelt støtten med pluggbar MultipartResolver gjenstander. Rammeverket gir en MultipartResolver implementering for bruk med Commons FileUpload og en annen til bruk med Servlet 3.0 flerdelt forespørselstesting.

Etter å ha konfigurert MultipartResolver vi får se hvordan du laster opp en enkelt fil og flere filer.

Vi kommer også inn på Vårstøvel.

2. Commons FileUpload

Å bruke CommonsMultipartResolver for å håndtere filopplastingen, må vi legge til følgende avhengighet:

 commons-fileupload commons-fileupload 1.3.1 

Nå kan vi definere CommonsMultipartResolver bønne inn i vårkonfigurasjonen.

Dette MultipartResolver kommer med en serie sett metode for å definere egenskaper som maksimal størrelse for opplasting:

@Bean (name = "multipartResolver") public CommonsMultipartResolver multipartResolver () {CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver (); multipartResolver.setMaxUploadSize (100000); returnere flere delerResolver; }

Her må vi kontrollere forskjellige egenskaper av CommonsMultipartResolver i selve Bean-definisjonen.

3. Med Servlet 3.0

For å bruke Servlet 3.0 flerdelt analyse, må vi konfigurere et par stykker av applikasjonen. Først må vi sette en MultipartConfigElement i vår DispatcherServletregistrering:

offentlig klasse MainWebAppInitializer implementerer WebApplicationInitializer {private String TMP_FOLDER = "/ tmp"; privat int MAX_UPLOAD_SIZE = 5 * 1024 * 1024; @Override public void onStartup (ServletContext sc) kaster ServletException {ServletRegistration.Dynamic appServlet = sc.addServlet ("mvc", new DispatcherServlet (new GenericWebApplicationContext ())); appServlet.setLoadOnStartup (1); MultipartConfigElement multipartConfigElement = nytt MultipartConfigElement (TMP_FOLDER, MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2); appServlet.setMultipartConfig (multipartConfigElement); }}

I MultipartConfigElement objektet, har vi konfigurert lagringsplasseringen, maksimal individuell filstørrelse, maksimal forespørselsstørrelse (når det gjelder flere filer i en enkelt forespørsel) og størrelsen som fremdriften for filopplasting skylles til lagringsplassen.

Disse innstillingene må brukes på servletregistreringsnivå, som Servlet 3.0 tillater ikke at de blir registrert i MultipartResolver som tilfellet er med CommonsMultipartResolver.

Når dette er gjort, vi kan legge til StandardServletMultipartResolver til vårkonfigurasjonen:

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

4. Laste opp en fil

For å laste opp filen vår, kan vi lage et enkelt skjema der vi bruker en HTML inngang tag med type = 'fil'.

Uavhengig av opplastingshåndteringskonfigurasjonen, har vi valgt, vi må sette kodingsattributtet til skjemaet til flerdelt / skjemadata. Dette lar nettleseren vite hvordan man skal kode skjemaet:

Velg en fil du vil laste opp

For å lagre den opplastede filen kan vi bruke en MultipartFile variabel. Vi kan hente denne variabelen fra forespørselsparameteren i kontrollerens metode:

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

De MultipartFile klasse gir tilgang til detaljer om den opplastede filen, inkludert filnavn, filtype og så videre. Vi kan bruke en enkel HTML-side for å vise denne informasjonen:

Sendt fil

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

5. Laster opp Flere filer

For å laste opp flere filer i en enkelt forespørsel, legger vi ganske enkelt flere felt for inndatafil i skjemaet:

Velg en fil du vil laste opp
Velg en fil du vil laste opp
Velg en fil du vil laste opp

Vi må passe på at hvert inndatafelt har samme navn, slik at det er tilgjengelig som en rekke MultipartFile:

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

Nå kan vi ganske enkelt gjenta over den matrisen for å vise informasjon om filer:

   Spring MVC File Upload 

Innsendte filer

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

6. Laste opp filer med tilleggsdata

Vi kan også sende tilleggsinformasjon til serveren sammen med filen som lastes opp. Vi må bare inkludere de obligatoriske feltene i skjemaet:

Navn
E-post
Velg en fil du vil laste opp

I kontrolleren kan vi få alle skjemadataene ved hjelp av @RequestParam kommentar:

@PostMapping ("/ uploadFileWithAddtionalData") offentlig strenginnsending (@RequestParam MultipartFile-fil, @RequestParam strengnavn, @RequestParam streng-e-post, ModelMap modelMap) {modelMap.addAttribute ("navn", navn); modelMap.addAttribute ("e-post", e-post); modelMap.addAttribute ("fil", fil); returner "fileUploadView"; }

I likhet med tidligere seksjoner kan vi bruke HTML-siden med JSTL koder for å vise informasjonen.

Vi kan også kapsle inn alle skjemafeltene i en modellklasse og bruke @ModelAttribute kommentar i kontrolleren. Dette vil være nyttig når det er mange flere felt sammen med filen. La oss se på koden:

offentlig klasse FormDataWithFile {private strengnavn; privat streng e-post; privat MultipartFile-fil; // standard getters og setters}
@PostMapping ("/ uploadFileModelAttribute") offentlig strenginnsending (@ModelAttribute FormDataWithFile formDataWithFile, ModelMap modelMap) {modelMap.addAttribute ("formDataWithFile", formDataWithFile); returner "fileUploadView"; }

7. Last opp filoppstartfil

Hvis vi bruker Spring Boot, gjelder fortsatt alt vi har sett.

Spring Boot gjør det imidlertid enda enklere å konfigurere og starte alt med lite bry.

Spesielt, det er ikke nødvendig å konfigurere noen servlet, som Boot vil registrere og konfigurere det for oss, forutsatt at vi inkluderer nettmodulen i våre avhengigheter:

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

Vi finner den nyeste versjonen av spring-boot-starter-web på Maven Central.

Hvis vi vil kontrollere maksimal filopplastingsstørrelse, kan vi redigere application.properties:

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

Vi kan også kontrollere om filopplasting er aktivert, og stedet for filopplasting:

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

Merk at vi har brukt $ {java.io.tmpdir} for å definere opplastingsplasseringen slik at vi kan bruke den midlertidige plasseringen for forskjellige operativsystemer.

8. Konklusjon

I denne artikkelen så vi på forskjellige måter å konfigurere flerdelt støtte på våren. Ved hjelp av disse kan vi støtte filopplastinger i webapplikasjonene våre.

Implementeringen av denne veiledningen finner du i et GitHub-prosjekt. Når prosjektet kjører lokalt, kan du få tilgang til skjemaeksemplet på // localhost: 8080 / spring-mvc-java / fileUpload


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