Učitavanje datoteka pomoću servleta i JSP-a

1. Uvod

U ovom brzom vodiču vidjet ćemo kako prenijeti datoteku iz servleta.

Da bismo to postigli, prvo ćemo vidjeti vanilijevo rješenje Jakarta EE s mogućnostima prijenosa datoteka koje pruža izvorni @MultipartConfig bilješka.

Zatim ćemo pregledati Apache Commons FileUpload knjižnica, za starije verzije API-ja Servlet.

2. Korištenje Jakarte EE @MultipartConfig

Jakarta EE ima mogućnost podržavanja višedijelnih prijenosa iz kutije.

Kao takav, to je vjerojatno zadani postupak obogaćivanja Jakarta EE aplikacije podrškom za prijenos datoteka.

Prvo, dodamo obrazac u našu HTML datoteku:

 Odaberite datoteku: 

Obrazac treba definirati pomoću enctype = "multipart / form-data" atribut za signal višedijelnog prijenosa.

Sljedeći, morat ćemo napomenuti svoje HttpServlet s točnim informacijama pomoću @MultipartConfig bilješka:

@MultipartConfig (fileSizeThreshold = 1024 * 1024, maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5) javna klasa MultipartServlet proširuje HttpServlet {// ...} 

Zatim, provjerimo je li postavljena naša zadana mapa za prijenos poslužitelja:

Niz uploadPath = getServletContext (). GetRealPath ("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = nova datoteka (uploadPath); if (! uploadDir.exists ()) uploadDir.mkdir (); 

Konačno, možemo lako doći dolazno Datoteka od zahtjev koristiti getParts () metodai spremite ga na disk:

za (dio dijela: request.getParts ()) {ime_datoteke = getFileName (dio); part.write (uploadPath + File.separator + fileName); } 

Imajte na umu da u ovom primjeru koristimo pomoćnu metodu getFileName ():

private String getFileName (Dio) {for (Sadržaj niza: part.getHeader ("content-disposition"). split (";")) {if (content.trim (). startWith ("filename")) return content. podniz (content.indexOf ("=") + 2, content.length () - 1); } return Constants.DEFAULT_FILENAME; }

Za Servlet 3.1. projekti, mogli bismo alternativno koristiti Part.getSubmitFileName () metoda:

fileName = part.getSubmitFileName ();

3. Korištenje Apache Commons FileUpload

Ako nismo na projektu Servlet 3.0, možemo izravno koristiti knjižnicu Apache Commons FileUpload.

3.1. Postaviti

Mi ćemo htjeti koristiti sljedeće pom.xml ovisnosti za pokretanje našeg primjera:

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

Najnovije verzije možete pronaći brzim pretraživanjem Mavenova središnjeg spremišta: commons-fileupload i commons-io.

3.2. Prenesi Servlet

Tri glavna dijela koja uključuju Apache FileUpload knjižnica ide na sljedeći način:

  • Obrazac za prijenos u a .jsp stranica.
  • Konfiguriranje vašeg DiskFileItemFactory i ServletFileUpload objekt.
  • Obrada stvarnog sadržaja prenosa datoteke s više dijelova.

Obrazac za prijenos jednak je onome u prethodnom odjeljku.

Krenimo s izradom našeg servleta Jakarta EE.

U našu metodu obrade zahtjeva možemo umotati dolazne HttpRequest provjerom radi li se o višedijelnom prijenosu.

Također ćemo odrediti koje ćemo resurse privremeno dodijeliti za prijenos datoteke (dok se obrađuju) na našem DiskFileItemFactory.

Posljednje, stvorit ćemo a ServletFileUpload objekt koji će predstavljati samu stvarnu datoteku. Izložit će sadržaj višedijelnog prijenosa za konačnu stranu poslužitelja za trajnost:

if (ServletFileUpload.isMultipartContent (zahtjev)) {Factory DiskFileItemFactory = nova DiskFileItemFactory (); factory.setSizeThreshold (MEMORY_THRESHOLD); factory.setRepository (nova datoteka (System.getProperty ("java.io.tmpdir"))); ServletFileUpload upload = novi ServletFileUpload (tvornički); upload.setFileSizeMax (MAX_FILE_SIZE); upload.setSizeMax (MAX_REQUEST_SIZE); Niz uploadPath = getServletContext (). GetRealPath ("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = nova datoteka (uploadPath); if (! uploadDir.exists ()) {uploadDir.mkdir (); } // ...}

Tada možemo izdvojiti taj sadržaj i zapisati ga na disk:

if (ServletFileUpload.isMultipartContent (zahtjev)) {// ... Popis formItems = upload.parseRequest (zahtjev); if (formItems! = null && formItems.size ()> 0) {for (FileItem item: formItems) {if (! item.isFormField ()) {String fileName = nova datoteka (item.getName ()). getName () ; String filePath = uploadPath + File.separator + fileName; File storeFile = nova datoteka (filePath); item.write (storeFile); request.setAttribute ("poruka", "Datoteka" + Ime datoteke + "uspješno je prenesena!"); }}}}

4. Pokretanje primjera

Nakon što smo naš projekt pretočili u .rat, možemo ga dodati u našu lokalnu instancu Tomcat i pokrenuti.

Odatle možemo prikazati glavni prikaz prijenosa u kojem nam je predstavljen obrazac:

Nakon uspješnog prijenosa naše datoteke, trebali bismo vidjeti poruku:

Na kraju, možemo provjeriti mjesto navedeno u našem servletu:

5. Zaključak

To je to! Naučili smo kako omogućiti višedijelne prijenose datoteka koristeći Jakarta EE, kao i Apache's Common FileUpload knjižnica!

Isječci koda, kao i uvijek, mogu se naći na GitHubu.