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.