Tavaszi és Apache FileUpload

1. Áttekintés

A Apache Commons fájlfeltöltési könyvtár segít nagy fájlokat feltölteni a HTTP protokollon keresztül a többrészes / űrlap-adat tartalom típus.

Ebben a gyors bemutatóban megvizsgáljuk, hogyan lehet integrálni a Spring-be.

2. Maven-függőségek

A könyvtár használatához szükségünk lesz a commons-fileupload műalkotás:

 commons-fileupload commons-fileupload 1.3.3 

A legújabb verzió megtalálható a Maven Central oldalon.

3. Az összes átvitele egyszerre

Bemutató célokra létrehozunk egy Vezérlő kérelmek feldolgozása fájl hasznos terheléssel:

@PostMapping ("/ upload") public String handleUpload (HttpServletRequest kérés) dobja a Kivételt {boolean isMultipart = ServletFileUpload.isMultipartContent (kérés); DiskFileItemFactory gyár = new DiskFileItemFactory (); factory.setRepository (új File (System.getProperty ("java.io.tmpdir"))); gyár.setSizeThreshold (DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); factory.setFileCleaningTracker (null); ServletFileUpload upload = új ServletFileUpload (gyári); Tételek listája = upload.parseRequest (kérés); Iterátor iter = tételek.iterátor (); 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); }}} return "siker!"; } 

Kezdetben, ellenőriznünk kell, hogy a kérelem tartalmaz-e több részből álló tartalmat használni a isMultipartContent módszer található a ServletFileUpload osztály a könyvtárból.

Alapértelmezés szerint, A tavasz jellemzői a MultipartResolverhogy le kell tiltanunk a könyvtár használatát. Ellenkező esetben elolvassa a kérés tartalmát, mielőtt eljutna hozzánk Vezérlő.

Ezt úgy érhetjük el, hogy ezt a konfigurációt belefoglaljuk a rendszerbe alkalmazás.tulajdonságok fájl:

spring.http.multipart.enabled = hamis

Most beállíthatjuk azt a könyvtárat, ahová a fájljaink mentésre kerülnek, azt a küszöböt, amelyben a könyvtár úgy dönt, hogy ír a lemezre, és ha a fájlokat a kérés lejárta után törölni kell.

A könyvtár biztosítja a DiskFileItemFactory osztály, hogya konfiguráció felelősségét vállalja a fájlok mentéséért és tisztításáért. A setRepository A metódus megadja a célkönyvtárat, az alapértelmezett példával.

Ezután a setSizeThreshold beállítja a maximális fájlméretet.

Aztán megvan a setFileCleaningTracker módszer, amely nullára állítva az ideiglenes fájlokat érintetlenül hagyja. Alapértelmezés szerint a kérés befejezése után törli őket.

Most folytathatjuk a tényleges fájlkezelést.

Először létrehozzuk a sajátunkat ServletFileUpload a korábban létrehozott gyárunk bevonásával; majd folytatjuk a kérelem elemzését és létrehozunk egy listát FileItem amelyek a könyvtár fő absztrakciója az űrlapmezők számára.

Most, ha tudjuk, hogy ez nem egy normál űrlapmező, akkor folytatjuk a InputStream és a hasznos másolási módszer meghívása innen: IOUtils (további lehetőségekért tekintse meg ezt az oktatóanyagot).

Most a fájlunkat a szükséges mappában tároljuk. Ez általában kényelmesebb módszer a helyzet kezelésére, mivel lehetővé teszi a fájlokhoz való könnyű hozzáférést, ugyanakkor az idő / memória hatékonysága sem optimális.

A következő szakaszban megnézzük a streaming API-t.

4. Streaming API

A streaming API könnyen használható, így nagyszerű módja a nagy fájlok feldolgozásának, egyszerűen nem átmásolva ideiglenes helyre:

ServletFileUpload upload = új ServletFileUpload (); FileItemIterator iterStream = upload.getItemIterator (kérés); while (iterStream.hasNext ()) {FileItemStream elem = iterStream.next (); Karakterlánc neve = item.getFieldName (); InputStream adatfolyam = item.openStream (); if (! item.isFormField ()) {// Az InputStream feldolgozása} else {String formFieldValue = Streams.asString (stream); }} 

Az előző kódrészletből láthatjuk, hogy a DiskFileItemFactory. Ez azért van, mert, a streaming API használatakor nincs rá szükségünk.

Ezután a mezők feldolgozásához a könyvtár biztosítja a FileItemIterator, amely addig nem olvas semmit, amíg ki nem vonjuk őket a kérésből a következő módszer.

Végül láthatjuk, hogyan lehet megszerezni a többi űrlapmező értékét.

5. Következtetés

Ebben a cikkben áttekintettük, hogyan használhatjuk az Apache Commons File Upload Library with Spring programját nagy fájlok feltöltésére és feldolgozására.

Mint mindig, a teljes forráskód megtalálható a GitHub oldalon.