Spring og Apache FileUpload

1. Oversigt

Det Apache Commons File Upload Library hjælper os med at uploade store filer via HTTP-protokollen ved hjælp af multipart / form-data indholdstype.

I denne hurtige vejledning skal vi se på, hvordan man integrerer det med foråret.

2. Maven-afhængigheder

For at bruge biblioteket har vi brug for commons-fileupload artefakt:

 commons-fileupload commons-fileupload 1.3.3 

Den seneste version kan findes på Maven Central.

3. Overføre alt på én gang

Til demonstrationsformål opretter vi en Controller behandling af anmodninger med en fil nyttelast:

@PostMapping ("/ upload") offentlig streng handleUpload (HttpServletRequest anmodning) kaster undtagelse {boolean isMultipart = ServletFileUpload.isMultipartContent (anmodning); DiskFileItemFactory fabrik = ny DiskFileItemFactory (); factory.setRepository (ny fil (System.getProperty ("java.io.tmpdir"))); factory.setSizeThreshold (DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); factory.setFileCleaningTracker (null); ServletFileUpload upload = ny ServletFileUpload (fabrik); Listeelementer = upload.parseRequest (anmodning); Iterator iter = items.iterator (); mens (iter.hasNext ()) {FileItem element = iter.next (); hvis (! item.isFormField ()) {prøv (InputStream uploadetStream = item.getInputStream (); OutputStream out = ny FileOutputStream ("file.mov");) {IOUtils.copy (uploadedStream, out); }}} returner "succes!"; } 

I begyndelsen, Vi skal kontrollere, om anmodningen indeholder et indhold med flere dele bruger erMultipartContent metode, der findes i ServletFileUpload klasse fra biblioteket.

Som standard, Foråret har en MultipartResolverat vi bliver nødt til at deaktivere for at bruge dette bibliotek. Ellers læser den indholdet af anmodningen, inden den når vores Controller.

Vi kan opnå dette ved at inkludere denne konfiguration i vores application.properties fil:

spring.http.multipart.enabled = false

Nu kan vi indstille kataloget, hvor vores filer skal gemmes, tærsklen, hvor biblioteket beslutter at skrive til disk, og hvis filer skal slettes, når anmodningen slutter.

Biblioteket tilbyder en DiskFileItemFactory klasse dettager ansvaret for konfigurationen til arkivering og rengøring. Det setRepository metoden indstiller målkataloget, hvor standard vises i eksemplet.

Dernæst setSizeThreshold indstiller en maksimal filstørrelse.

Så har vi setFileCleaningTracker metode, der, når den er indstillet til null, efterlader de midlertidige filer uberørt. Som standard slettes den, når anmodningen er afsluttet.

Nu kan vi fortsætte med den faktiske filhåndtering.

Først opretter vi vores ServletFileUpload ved at inkludere vores tidligere oprettede fabrik så fortsætter vi med at analysere anmodningen og generere en liste over FileItem som er hovedabstraktionen af ​​biblioteket for formularfelterne.

Hvis vi ved, at det ikke er et normalt formfelt, fortsætter vi med at udtrække InputStream og at kalde den nyttige kopimetode fra IOUtils (for flere muligheder kan du se på denne vejledning).

Nu har vi vores fil gemt i den nødvendige mappe. Dette er normalt en mere bekvem måde at håndtere denne situation på, da det giver let adgang til filerne, men også tid / hukommelseseffektivitet er ikke optimal.

I det næste afsnit skal vi se på streaming-API'en.

4. Streaming API

Streaming-API'et er let at bruge, hvilket gør det til en fantastisk måde at behandle store filer ved simpelthen ikke at kopiere til et midlertidigt sted:

ServletFileUpload upload = ny ServletFileUpload (); FileItemIterator iterStream = upload.getItemIterator (anmodning); mens (iterStream.hasNext ()) {FileItemStream-emne = iterStream.next (); String name = item.getFieldName (); InputStream stream = item.openStream (); hvis (! item.isFormField ()) {// Behandle InputStream} ellers {String formFieldValue = Streams.asString (stream); }} 

Vi kan se i det forrige kodestykke, at vi ikke længere inkluderer en DiskFileItemFactory. Dette er fordi, når vi bruger streaming-API'en, har vi ikke brug for det.

For at behandle felter giver biblioteket derefter en FileItemIterator, som ikke læser noget, før vi trækker dem ud af anmodningen med Næste metode.

Endelig kan vi se, hvordan man opnår værdierne for de andre formularfelter.

5. Konklusion

I denne artikel har vi gennemgået, hvordan vi kan bruge Apache Commons File Upload Library med Spring til at uploade og behandle store filer.

Som altid kan den fulde kildekode findes på GitHub.