Fájlok feltöltése szervletekkel és JSP-vel
1. Bemutatkozás
Ebben a gyors bemutatóban megtudhatjuk, hogyan lehet feltölteni egy fájlt egy szervletről.
Ennek elérése érdekében először a vanilla Jakarta EE megoldást fogjuk látni, a fájlok feltöltési képességeivel, amelyeket a native nyújt @MultipartConfig annotáció.
Ezután átmegyünk az Apache Commonson Fájlfeltöltés könyvtár, a Servlet API korábbi verzióihoz.
2. Jakarta EE használata @MultipartConfig
A Jakarta EE képes a dobozon kívüli többrészes feltöltések támogatására.
Mint ilyen, valószínűleg ez az alapértelmezett lépés, amikor a Jakarta EE alkalmazást fájlfeltöltési támogatással gazdagítják.
Először adjunk hozzá egy űrlapot a HTML fájlunkhoz:
Válasszon egy fájlt:
Az űrlapot a enctype = "multipart / form-data" attribútum a többrészes feltöltés jelzésére.
Következő, meg akarjuk jegyezni a sajátunkat HttpServlet a helyes információkkal a @MultipartConfig annotáció:
@MultipartConfig (fileSizeThreshold = 1024 * 1024, maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5) A MultipartServlet nyilvános osztály kiterjeszti a HttpServlet {// ...}
Ezután ellenőrizzük, hogy az alapértelmezett kiszolgáló feltöltési mappánk be van-e állítva:
Karakterlánc uploadPath = getServletContext (). GetRealPath ("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = új File (uploadPath); ha (! uploadDir.exists ()) uploadDir.mkdir ();
Végül, könnyen visszakereshetjük bejövőinket File tól kérés használni a getParts () módszer, és mentse a lemezre:
for (Részrész: request.getParts ()) {fájlNév = getFileName (rész); part.write (uploadPath + File.separator + fileName); }
Vegye figyelembe, hogy ebben a példában a getFileName () segítő metódust használjuk:
private String getFileName (Part part) {for (String content: part.getHeader ("content-disposition"). split (";")) {if (content.trim (). startsWith ("fájlnév")) visszatérő tartalom. szubsztring (tartalom.indexOf ("=") + 2, tartalom.hossz () - 1); } return Constants.DEFAULT_FILENAME; }
A Servlet 3.1-hez. projektek alternatívaként használhatnánk a Part.getSubetedFileName () módszer:
fájlnév = part.getSubendedFileName ();
3. Az Apache Commons FileUpload használatával
Ha nem vagyunk egy Servlet 3.0 projektben, akkor közvetlenül használhatjuk az Apache Commons FileUpload könyvtárat.
3.1. Beállít
A következőket akarjuk használni pom.xml függőségek a példánk futtatásához:
commons-fileupload commons-fileupload 1.3.3 commons-io commons-io 2.6
A legfrissebb verziók gyors kereséssel találhatók meg a Maven központi adattárában: commons-fileupload és commons-io.
3.2. Servlet feltöltése
Az Apache-ok beépítésének három fő része Fájlfeltöltés könyvtár megy a következőképpen:
- Egy feltöltési űrlap a .jsp oldalt.
- A DiskFileItemFactory és ServletFileUpload tárgy.
- A többrészes fájl feltöltésének tényleges tartalmának feldolgozása.
A feltöltési űrlap megegyezik az előző szakaszban szereplővel.
Térjünk át a Jakarta EE szervlet létrehozására.
Kérésfeldolgozási módszerünkben be tudjuk burkolni a bejövőt HttpRequest ellenőrzéssel, hogy ez egy több részből álló feltöltés.
Meghatározzuk azt is, hogy milyen forrásokat rendeljünk a fájl feltöltéséhez ideiglenesen (feldolgozás közben) a fájlunkra DiskFileItemFactory.
Végül, létrehozunk egy ServletFileUpload objektum, amely magát a tényleges fájlt fogja képviselni. A többrészes feltöltés tartalmát teszi közzé a végső perzisztencia kiszolgálói oldalon:
if (ServletFileUpload.isMultipartContent (kérelem)) {DiskFileItemFactory gyár = új DiskFileItemFactory (); gyár.setSizeThreshold (MEMORY_THRESHOLD); factory.setRepository (új Fájl (System.getProperty ("java.io.tmpdir"))); ServletFileUpload upload = új ServletFileUpload (gyári); upload.setFileSizeMax (MAX_FILE_SIZE); upload.setSizeMax (MAX_REQUEST_SIZE); Karakterlánc uploadPath = getServletContext (). GetRealPath ("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = új File (uploadPath); if (! uploadDir.exists ()) {uploadDir.mkdir (); } // ...}
Ezután kinyerhetjük ezeket a tartalmakat és lemezre írhatjuk:
if (ServletFileUpload.isMultipartContent (kérelem)) {// ... Lista formItems = upload.parseRequest (kérés); if (formItems! = null && formItems.size ()> 0) {for (FileItem item: formItems) {if (! item.isFormField ()) {String fájlnév = új fájl (item.getName ()). getName () ; Karaktersorozat filePath = uploadPath + File.separator + fileName; File storeFile = új fájl (filePath); item.write (storeFile); request.setAttribute ("üzenet", "Fájl" + fájlnév + "sikeresen feltöltve!"); }}}}
4. A példa futtatása
Miután összeállítottuk projektünket a .háború, bedobhatjuk a helyi Tomcat példányunkba és elindíthatjuk.
Innen előhívhatjuk a fő feltöltési nézetet, ahol egy űrlapot kapunk:

A fájlunk sikeres feltöltése után látnunk kell az üzenetet:

Végül ellenőrizhetjük a szervletünkben megadott helyet:

5. Következtetés
Ez az! Megtanultuk, hogyan lehet többrészes fájlokat feltölteni a Jakarta EE, valamint az Apache's Common használatával Fájlfeltöltés könyvtár!
A kódrészletek, mint mindig, a GitHubon találhatók.