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.