Proljeće i Apache FileUpload

1. Pregled

The Apache Commons datoteka za prijenos datoteka pomaže nam u uploadu velikih datoteka putem HTTP protokola pomoću višedijelni / obrasci-podaci vrsta sadržaja.

U ovom ćemo brzom vodiču pogledati kako ga integrirati s Springom.

2. Ovisnosti Mavena

Da bismo koristili knjižnicu, trebat će nam commons-fileupload artefakt:

 commons-fileupload commons-fileupload 1.3.3 

Najnoviju verziju možete pronaći na Maven Central.

3. Prijenos svih odjednom

U demonstracijske svrhe izradit ćemo Kontroler obrada zahtjeva s korisnim opterećenjem datoteke:

@PostMapping ("/ upload") javni niz handleUpload (HttpServletRequest zahtjev) baca iznimku {boolean isMultipart = ServletFileUpload.isMultipartContent (zahtjev); DiskFileItemFactory tvornica = nova DiskFileItemFactory (); factory.setRepository (nova datoteka (System.getProperty ("java.io.tmpdir"))); factory.setSizeThreshold (DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); factory.setFileCleaningTracker (null); ServletFileUpload upload = novi ServletFileUpload (tvornički); Stavke na popisu = upload.parseRequest (zahtjev); Iterator iter = items.iterator (); while (iter.hasNext ()) {FileItem item = iter.next (); if (! item.isFormField ()) {try (InputStream uploadedStream = item.getInputStream (); OutputStream out = new FileOutputStream ("file.mov");) {IOUtils.copy (uploadedStream, out); }}} vrati "uspjeh!"; } 

U početku, moramo provjeriti sadrži li zahtjev višedjelni sadržaj koristiti jeMultipartContent metoda pronađena u ServletFileUpload razred iz knjižnice.

Prema zadanim postavkama, Proljeće ima a MultipartResolverda ćemo morati onemogućiti upotrebu ove knjižnice. Inače će pročitati sadržaj zahtjeva prije nego što stigne do našeg Kontroler.

To možemo postići uključivanjem ove konfiguracije u našu primjena.svojstva datoteka:

opruga.http.multipart.enabled = false

Sada možemo postaviti direktorij u kojem će se naše datoteke spremati, prag u kojem knjižnica odlučuje zapisivati ​​na disk i treba li datoteke brisati nakon završetka zahtjeva.

Knjižnica pruža a DiskFileItemFactory razred kojipreuzima odgovornost za konfiguraciju za spremanje i čišćenje datoteka. The setRepository metoda postavlja ciljni direktorij, a zadani prikaz je prikazan u primjeru.

Dalje, setSizeThreshold postavlja maksimalnu veličinu datoteke.

Tada imamo setFileCleaningTracker metoda koja, kada je postavljena na nulu, ostavlja privremene datoteke netaknutima. Prema zadanim postavkama briše ih nakon završetka zahtjeva.

Sada možemo nastaviti sa stvarnim rukovanjem datotekama.

Prvo, mi stvaramo svoje ServletFileUpload uključivanjem naše prethodno stvorene tvornice; zatim nastavljamo s raščlanjivanjem zahtjeva i generiranjem popisa FileItem koji su glavna apstrakcija knjižnice za polja obrasca.

Sada ako znamo da to nije normalno polje obrasca, onda nastavljamo s izdvajanjem InputStream i pozvati korisnu metodu kopiranja iz IOUtils (za više opcija možete pogledati ovaj vodič).

Sada imamo našu datoteku pohranjenu u potrebnu mapu. Ovo je obično prikladniji način za rješavanje ove situacije jer omogućuje jednostavan pristup datotekama, ali također i učinkovitost vremena / memorije nije optimalna.

U sljedećem ćemo odjeljku pogledati API za streaming.

4. Streaming API

API za strujanje jednostavan je za upotrebu, što ga čini izvrsnim načinom obrade velikih datoteka jednostavnim kopiranjem na privremeno mjesto:

ServletFileUpload upload = novi ServletFileUpload (); FileItemIterator iterStream = upload.getItemIterator (zahtjev); while (iterStream.hasNext ()) {FileItemStream item = iterStream.next (); Ime niza = item.getFieldName (); InputStream stream = item.openStream (); if (! item.isFormField ()) {// Obradite InputStream} else {String formFieldValue = Streams.asString (stream); }} 

U prethodnom isječku koda možemo vidjeti da više ne uključujemo DiskFileItemFactory. Ovo je zbog, kada koristimo streaming API, ne treba nam.

Dalje, za obradu polja, knjižnica nudi a FileItemIterator, koji ništa ne čita dok ih ne izdvojimo iz zahtjeva pomoću Sljedeći metoda.

Napokon, možemo vidjeti kako dobiti vrijednosti ostalih polja obrasca.

5. Zaključak

U ovom smo članku pregledali kako možemo koristiti biblioteku za prijenos datoteka Apache Commons s Springom za prijenos i obradu velikih datoteka.

Kao i uvijek puni izvorni kod možete pronaći na GitHub-u.


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