Nahrávanie súborov pomocou servletov a JSP

1. Úvod

V tomto rýchlom návode sa dozvieme, ako nahrať súbor z servletu.

Aby sme to dosiahli, najskôr uvidíme vanilkové riešenie Jakarta EE s možnosťami nahrávania súborov poskytované natívom @MultipartConfig anotácia.

Potom prejdeme Apache Commons Nahranie súboru knižnica, pre staršie verzie Servlet API.

2. Používanie Jakarta EE @MultipartConfig

Jakarta EE má schopnosť podporovať viacdielne nahrávanie po vybalení z krabice.

Pravdepodobne ide o predvolený postup pri obohatení aplikácie Jakarta EE o podporu nahrávania súborov.

Najprv do nášho súboru HTML pridáme formulár:

 Vyberte súbor: 

Formulár by sa mal definovať pomocou enctype = ”multipart / form-data” atribút signalizujúci viacdielne nahrávanie.

Ďalšie, budeme chcieť anotovať naše HttpServlet so správnymi informáciami pomocou @MultipartConfig anotácia:

@MultipartConfig (fileSizeThreshold = 1024 * 1024, maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5) verejná trieda MultipartServlet rozširuje HttpServlet {// ...} 

Potom skontrolujte, či je nastavený náš predvolený priečinok na nahrávanie na server:

Reťazec uploadPath = getServletContext (). GetRealPath ("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = nový súbor (uploadPath); if (! uploadDir.exists ()) uploadDir.mkdir (); 

Nakoniec môžeme ľahko načítať naše prichádzajúce Súbor z žiadosť pomocou getParts () metódaa uložte ho na disk:

for (Part part: request.getParts ()) {fileName = getFileName (part); part.write (uploadPath + File.separator + fileName); } 

Upozorňujeme, že v tomto príklade používame pomocnú metódu getFileName ():

private String getFileName (Part part) {for (String content: part.getHeader ("content-disposition"). split (";")) {if (content.trim (). startsWith ("filename")) return content. podreťazec (content.indexOf ("=") + 2, content.length () - 1); } návratové konštanty.DEFAULT_FILENAME; }

Pre servlet 3.1. projekty by sme mohli alternatívne použiť Part.getSubmittedFileName () metóda:

fileName = part.getSubmitFileName ();

3. Používanie Apache Commons FileUpload

Pokiaľ nie sme na projekte Servlet 3.0, môžeme priamo použiť knižnicu Apache Commons FileUpload.

3.1. Nastaviť

Budeme chcieť použiť nasledujúce pom.xml závislosti, aby sme spustili náš príklad:

 commons-fileupload commons-fileupload 1.3.3 commons-io commons-io 2.6 

Najnovšie verzie nájdete pomocou rýchleho vyhľadávania v centrálnom úložisku Maven: commons-fileupload a commons-io.

3.2. Nahrajte servlet

Tri hlavné časti začlenenia Apache Nahranie súboru knižnica:

  • Formulár na nahranie v a .jsp stránke.
  • Konfigurácia vášho DiskFileItemFactory a ServletFileUpload objekt.
  • Spracovanie skutočného obsahu nahrávania viacdielneho súboru.

Formulár na odovzdanie je rovnaký ako v predchádzajúcej časti.

Prejdime k vytvoreniu nášho servletu Jakarta EE.

V našej metóde spracovania žiadosti môžeme zabaliť prichádzajúce HttpRequest s kontrolou, či ide o viacdielne nahrávanie.

Tiež určíme, aké zdroje alokovať na dočasné nahranie súboru (počas spracovania) na našom DiskFileItemFactory.

Nakoniec vytvoríme ServletFileUpload objekt, ktorý bude predstavovať samotný aktuálny súbor. Vystaví obsah viacdielneho nahrávania na strane servera konečnej perzistencie:

if (ServletFileUpload.isMultipartContent (request)) {DiskFileItemFactory factory = new DiskFileItemFactory (); factory.setSizeThreshold (MEMORY_THRESHOLD); factory.setRepository (nový súbor (System.getProperty ("java.io.tmpdir"))); ServletFileUpload upload = nový ServletFileUpload (továrenský); upload.setFileSizeMax (MAX_FILE_SIZE); upload.setSizeMax (MAX_REQUEST_SIZE); Reťazec uploadPath = getServletContext (). GetRealPath ("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = nový súbor (uploadPath); if (! uploadDir.exists ()) {uploadDir.mkdir (); } // ...}

Potom môžeme tento obsah extrahovať a zapísať na disk:

if (ServletFileUpload.isMultipartContent (request)) {// ... List formItems = upload.parseRequest (request); if (formItems! = null && formItems.size ()> 0) {for (FileItem item: formItems) {if (! item.isFormField ()) {String fileName = new File (item.getName ()). getName () ; Reťazec filePath = uploadPath + File.separator + fileName; File storeFile = nový súbor (filePath); item.write (storeFile); request.setAttribute ("message", "File" + fileName + "sa úspešne nahral!"); }}}}

4. Spustenie príkladu

Potom, čo sme zostavili náš projekt do .vojna, môžeme ho vložiť do našej miestnej inštancie Tomcat a spustiť ho.

Odtiaľ môžeme vyvolať hlavné zobrazenie nahrávania, kde sa nám zobrazí formulár:

Po úspešnom nahraní nášho súboru by sa mala zobraziť správa:

Nakoniec môžeme skontrolovať umiestnenie uvedené v našom servlete:

5. Záver

To je všetko! Naučili sme sa, ako zabezpečiť viacdielne nahrávanie súborov pomocou Jakarta EE, ako aj Apache's Common Nahranie súboru knižnica!

Útržky kódu, ako vždy, nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found