Laste opp filer med Servlets og JSP

1. Introduksjon

I denne raske opplæringen vil vi se hvordan du laster opp en fil fra en servlet.

For å oppnå dette ser vi først vanilje Jakarta EE-løsningen med filopplastingsfunksjoner levert av native @MultipartConfig kommentar.

Deretter går vi over Apache Commons Filopplasting bibliotek, for tidligere versjoner av Servlet API.

2. Bruke Jakarta EE @MultipartConfig

Jakarta EE har muligheten til å støtte opplasting i flere deler utenom esken.

Som sådan er det sannsynligvis en standard go-to når du beriker en Jakarta EE-app med støtte for filopplasting.

La oss først legge til et skjema i HTML-filen:

 Velg en fil: 

Skjemaet skal defineres ved hjelp av enctype = ”multipart / form-data” attributt for å signalisere en flerdelt opplasting.

Neste, vil vi kommentere vår HttpServlet med riktig informasjon ved hjelp av @MultipartConfig kommentar:

@MultipartConfig (fileSizeThreshold = 1024 * 1024, maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5) offentlig klasse MultipartServlet utvider HttpServlet {// ...} 

La oss deretter sørge for at standardopplastingsmappen for server er satt:

Streng uploadPath = getServletContext (). GetRealPath ("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = ny fil (uploadPath); hvis (! uploadDir.exists ()) uploadDir.mkdir (); 

Endelig, vi kan enkelt hente innkommende Fil fra be om bruker getParts () metode, og lagre den på disken:

for (Del del: request.getParts ()) {filnavn = getFilenavn (del); part.write (uploadPath + File.separator + fileName); } 

Merk at i dette eksemplet bruker vi en hjelpemetode getFileName ():

private String getFileName (Del del) {for (String content: part.getHeader ("content-disposition"). split (";")) {if (content.trim (). startsWith ("filnavn")) returner innhold. substring (content.indexOf ("=") + 2, content.length () - 1); } returner konstanter.DEFAULT_FILENAME; }

For Servlet 3.1. prosjekter, kan vi alternativt bruke Part.getSubmittedFileName () metode:

fileName = part.getSubmittedFileName ();

3. Bruke Apache Commons FileUpload

Hvis vi ikke er på et Servlet 3.0-prosjekt, kan vi bruke Apache Commons FileUpload-biblioteket direkte.

3.1. Oppsett

Vi vil bruke følgende pom.xml avhengigheter for å få vårt eksempel til å kjøre:

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

De nyeste versjonene kan bli funnet med et raskt søk på Mavens Central Repository: commons-fileupload og commons-io.

3.2. Last opp Servlet

De tre hoveddelene for å innlemme Apache Filopplasting biblioteket går som følger:

  • Et opplastingsskjema i en .jsp side.
  • Konfigurere din DiskFileItemFactory og ServletFileUpload gjenstand.
  • Behandler det faktiske innholdet i en flerdelt filopplasting.

Opplastingsskjemaet er det samme som i forrige avsnitt.

La oss gå videre til å lage vår Jakarta EE servlet.

I vår behandlingsmetode for forespørsel kan vi pakke innkommende HttpForespørsel med en sjekk for å se om det er flerdelt opplasting.

Vi vil også spesifisere hvilke ressurser som skal tildeles til filopplastingen midlertidig (mens den behandles) på vår DiskFileItemFactory.

Til slutt, vi lager en ServletFileUpload objekt som vil representere selve filen. Det vil utsette innholdet i flerdelt opplasting for endelig utholdenhetsserverside:

hvis (ServletFileUpload.isMultipartContent (forespørsel)) {DiskFileItemFactory fabrikk = ny DiskFileItemFactory (); factory.setSizeThreshold (MEMORY_THRESHOLD); factory.setRepository (ny fil (System.getProperty ("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload (fabrikk); upload.setFileSizeMax (MAX_FILE_SIZE); upload.setSizeMax (MAX_REQUEST_SIZE); Streng uploadPath = getServletContext (). GetRealPath ("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = ny fil (uploadPath); hvis (! uploadDir.exists ()) {uploadDir.mkdir (); } // ...}

Og så kan vi trekke ut innholdet og skrive det til disken:

hvis (ServletFileUpload.isMultipartContent (forespørsel)) {// ... Liste formItems = upload.parseRequest (forespørsel); if (formItems! = null && formItems.size ()> 0) {for (FileItem item: formItems) {if (! item.isFormField ()) {String fileName = new File (item.getName ()). getName () ; String filePath = uploadPath + File.separator + fileName; File storeFile = ny fil (filePath); item.write (storeFile); request.setAttribute ("melding", "Fil" + filnavn + "har blitt lastet opp vellykket!"); }}}}

4. Kjører eksemplet

Etter at vi har samlet prosjektet vårt til en .krig, kan vi slippe den i vår lokale Tomcat-forekomst og starte den opp.

Derfra kan vi hente opp hovedopplåsningsvisningen der vi får et skjema:

Etter å ha lastet opp filen vår, bør vi se meldingen:

Til slutt kan vi sjekke plasseringen som er spesifisert i servletten vår:

5. Konklusjon

Det er det! Vi har lært hvordan du kan tilby flere deler filopplastinger ved hjelp av Jakarta EE, samt Apache's Common Filopplasting bibliotek!

Kodebiter, som alltid, finnes på GitHub.