Spring and Apache FileUpload

1. Oversikt

De Apache Commons filopplastingsbibliotek hjelper oss med å laste opp store filer over HTTP-protokollen ved hjelp av flerdelt / skjemadata innholdstype.

I denne raske opplæringen skal vi ta en titt på hvordan vi kan integrere den med våren.

2. Maven-avhengigheter

For å bruke biblioteket trenger vi commons-fileupload gjenstand:

 commons-fileupload commons-fileupload 1.3.3 

Den siste versjonen finner du på Maven Central.

3. Overføre alt på en gang

For demonstrasjonsformål skal vi lage en Kontroller behandle forespørsler med en fil nyttelast:

@PostMapping ("/ upload") offentlig streng handleUpload (HttpServletRequest-forespørsel) kaster unntak {boolean isMultipart = ServletFileUpload.isMultipartContent (forespørsel); DiskFileItemFactory fabrikk = ny DiskFileItemFactory (); factory.setRepository (ny fil (System.getProperty ("java.io.tmpdir"))); factory.setSizeThreshold (DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); factory.setFileCleaningTracker (null); ServletFileUpload upload = new ServletFileUpload (fabrikk); Listeelementer = upload.parseRequest (forespørsel); Iterator iter = items.iterator (); mens (iter.hasNext ()) {FileItem-element = iter.next (); if (! item.isFormField ()) {try (InputStream uploadedStream = item.getInputStream (); OutputStream out = new FileOutputStream ("file.mov");) {IOUtils.copy (uploadedStream, out); }}} returner "suksess!"; } 

I begynnelsen, vi må sjekke om forespørselen inneholder et flerdelt innhold bruker erMultipartContent metoden funnet i ServletFileUpload klasse fra biblioteket.

Som standard, Våren har en MultipartResolverat vi må deaktivere for å bruke dette biblioteket. Ellers vil den lese innholdet i forespørselen før den når vårt Kontroller.

Vi kan oppnå dette ved å inkludere denne konfigurasjonen i vår application.properties fil:

spring.http.multipart.enabled = false

Nå kan vi angi katalogen der filene våre skal lagres, terskelen biblioteket bestemmer seg for å skrive til disk, og om filer skal slettes etter at forespørselen er avsluttet.

Biblioteket tilbyr en DiskFileItemFactory klasse dettar ansvaret for konfigurasjonen for fillagring og rengjøring. De setRepository metoden angir målkatalogen, og standard vises i eksemplet.

Neste, den setSizeThreshold angir en maksimal filstørrelse.

Så har vi setFileCleaningTracker metode som, når den er satt til null, lar de midlertidige filene være uberørt. Som standard sletter den dem etter at forespørselen er ferdig.

Nå kan vi fortsette til selve filhåndteringen.

Først lager vi vårt ServletFileUpload ved å inkludere vår tidligere opprettet fabrikk; så fortsetter vi med å analysere forespørselen og generere en liste over FileItem som er den viktigste abstraksjonen av biblioteket for skjemafeltene.

Nå hvis vi vet at det ikke er et vanlig skjemafelt, fortsetter vi med å trekke ut InputStream og å ringe den nyttige kopimetoden fra IOUtils (for flere alternativer kan du se på denne veiledningen).

Nå har vi filen vår lagret i den nødvendige mappen. Dette er vanligvis en mer praktisk måte å håndtere denne situasjonen på, da den gir enkel tilgang til filene, men også tid / minneeffektivitet er ikke optimal.

I neste avsnitt skal vi ta en titt på streaming-API.

4. Streaming API

Streaming-API-et er enkelt å bruke, noe som gjør det til en flott måte å behandle store filer ved ganske enkelt ikke å kopiere til et midlertidig sted:

ServletFileUpload upload = new ServletFileUpload (); FileItemIterator iterStream = upload.getItemIterator (forespørsel); mens (iterStream.hasNext ()) {FileItemStream-element = iterStream.next (); Strengnavn = item.getFieldName (); InputStream stream = item.openStream (); hvis (! item.isFormField ()) {// Behandle InputStream} ellers {String formFieldValue = Streams.asString (stream); }} 

Vi kan se i forrige kodebit at vi ikke lenger inkluderer en DiskFileItemFactory. Dette er fordi, når du bruker streaming-API, trenger vi ikke det.

Deretter, for å behandle felt, gir biblioteket en FileItemIterator, som ikke leser noe før vi trekker dem ut av forespørselen med neste metode.

Til slutt kan vi se hvordan man får tak i verdiene til de andre skjemafeltene.

5. Konklusjon

I denne artikkelen har vi gjennomgått hvordan vi kan bruke Apache Commons File Upload Library med Spring til å laste opp og behandle store filer.

Som alltid finner du full kildekode på GitHub.


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