Jarné a Apache FileUpload

1. Prehľad

The Knižnica nahrávania súborov Apache Commons nám pomáha nahrávať veľké súbory cez protokol HTTP pomocou multipart / form-data Druh obsahu.

V tomto rýchlom výučbe sa pozrieme na to, ako ho integrovať s jarom.

2. Maven závislosti

Na používanie knižnice budeme potrebovať commons-fileupload artefakt:

 commons-fileupload commons-fileupload 1.3.3 

Najnovšiu verziu nájdete na serveri Maven Central.

3. Prenos všetkých naraz

Na demonštračné účely vytvoríme a Kontrolór spracovanie požiadaviek s užitočným zaťažením súboru:

@PostMapping ("/ upload") public String handleUpload (požiadavka HttpServletRequest) vyvolá výnimku {boolean isMultipart = ServletFileUpload.isMultipartContent (požiadavka); DiskFileItemFactory factory = nový DiskFileItemFactory (); factory.setRepository (nový súbor (System.getProperty ("java.io.tmpdir"))); factory.setSizeThreshold (DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); factory.setFileCleaningTracker (null); ServletFileUpload upload = nový ServletFileUpload (továrenský); Zoznam položiek = upload.parseRequest (požiadavka); Iterátor iter = items.iterator (); while (iter.hasNext ()) {FileItem item = iter.next (); if (! item.isFormField ()) {try (InputStream uploadedStream = item.getInputStream (); OutputStream out = nový FileOutputStream ("file.mov");) {IOUtils.copy (uploadedStream, out); }}} vrátiť "úspech!"; } 

Na začiatku, musíme skontrolovať, či žiadosť obsahuje viacdielny obsah pomocou isMultipartContent metóda nájdená v ServletFileUpload triedy z knižnice.

Predvolene, Jarné prvky a MultipartResolverktoré budeme musieť deaktivovať, aby sme mohli používať túto knižnicu. Inak prečíta obsah žiadosti skôr, ako sa dostane k našej Kontrolór.

To môžeme dosiahnuť zahrnutím tejto konfigurácie do našej application.properties spis:

spring.http.multipart.enabled = false

Teraz môžeme nastaviť adresár, do ktorého sa budú naše súbory ukladať, prahovú hodnotu, v ktorej sa knižnica rozhodne zapisovať na disk a to, či sa majú súbory po skončení žiadosti vymazať.

Knižnica poskytuje a DiskFileItemFactory trieda žepreberá zodpovednosť za konfiguráciu za ukladanie a čistenie súborov. The setRepository metóda nastaví cieľový adresár, predvolená hodnota je uvedená v príklade.

Ďalej setSizeThreshold nastavuje maximálnu veľkosť súboru.

Potom máme setFileCleaningTracker metóda, ktorá keď nastaví na nulu, ponechá dočasné súbory nedotknuté. Predvolene ich odstráni po dokončení žiadosti.

Teraz môžeme pokračovať v samotnom spracovaní súborov.

Najskôr vytvoríme náš ServletFileUpload zahrnutím našej predtým vytvorenej továrne; potom pristúpime k analýze žiadosti a vygenerovaniu zoznamu FileItem ktoré sú hlavnou abstrakciou knižnice pre polia formulárov.

Teraz, keď vieme, že nejde o normálne pole formulára, pristúpime k extrakcii InputStream a zavolať užitočnú metódu kopírovania z IOUtils (ďalšie možnosti nájdete v tomto výučbe).

Teraz máme náš súbor uložený v potrebnom priečinku. Toto je zvyčajne pohodlnejší spôsob riešenia tejto situácie, pretože umožňuje ľahký prístup k súborom, ale tiež účinnosť času a pamäte nie je optimálna.

V nasledujúcej časti sa pozrieme na streamovacie API.

4. Streamovacie API

Streamovacie API sa ľahko používa, takže je skvelým spôsobom na spracovanie veľkých súborov jednoduchým kopírovaním na dočasné miesto:

ServletFileUpload upload = nový ServletFileUpload (); FileItemIterator iterStream = upload.getItemIterator (požiadavka); while (iterStream.hasNext ()) {FileItemStream item = iterStream.next (); Názov reťazca = item.getFieldName (); Stream InputStream = item.openStream (); if (! item.isFormField ()) {// Spracovať InputStream} else {String formFieldValue = Streams.asString (stream); }} 

Na predchádzajúcom útržku kódu môžeme vidieť, že už neobsahujeme a DiskFileItemFactory. To je preto, že, pri použití streamovacieho API to nepotrebujeme.

Ďalej na spracovanie polí knižnica poskytuje a FileItemIterator, ktorá nič nečíta, kým ich z žiadosti nevylúštime pomocou Ďalšie metóda.

Na záver vidíme, ako získať hodnoty ostatných polí formulára.

5. Záver

V tomto článku sme preskúmali, ako môžeme pomocou knižnice nahrávania súborov Apache Commons s programom Spring načítať a spracovať veľké súbory.

Celý zdrojový kód nájdete ako vždy na GitHub.