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.