Uploade filer med Servlets og JSP

1. Introduktion

I denne hurtige vejledning ser vi, hvordan man uploader en fil fra en servlet.

For at opnå dette ser vi først vaniljen Jakarta EE-løsning med filuploadfunktioner leveret af native @MultipartConfig kommentar.

Derefter går vi over Apache Commons Fil upload bibliotek til tidligere versioner af Servlet API.

2. Brug af Jakarta EE @MultipartConfig

Jakarta EE har evnen til at understøtte multidelt uploads ud af kassen.

Som sådan er det sandsynligvis en standard go-to, når du beriger en Jakarta EE-app med filupload-understøttelse.

Lad os først tilføje en formular til vores HTML-fil:

 Vælg en fil: 

Formularen skal defineres ved hjælp af enctype = ”multipart / form-data” attribut for at signalere en multipart-upload.

Næste, Vi vil gerne kommentere vores HttpServlet med de korrekte oplysninger ved hjælp af @MultipartConfig kommentar:

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

Lad os så sørge for, at vores standardserver til upload af mappe er indstillet:

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

Langt om længe, vi kan nemt hente vores indgående Fil fra anmodning bruger getParts () metode, og gem det på disken:

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

Bemærk, at vi i dette eksempel bruger en hjælpemetode getFileName ():

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

For Servlet 3.1. projekter, kunne vi alternativt bruge Part.getSubmittedFileName () metode:

fileName = part.getSubmittedFileName ();

3. Brug af Apache Commons FileUpload

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

3.1. Opsætning

Vi vil gerne bruge følgende pom.xml afhængigheder for at få vores eksempel til at køre:

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

De seneste versioner kan findes med en hurtig søgning på Mavens Central Repository: commons-fileupload og commons-io.

3.2. Upload Servlet

De tre hoveddele til at inkorporere Apache's Fil upload biblioteket går som følger:

  • En uploadformular i en .jsp side.
  • Konfiguration af din DiskFileItemFactory og ServletFileUpload objekt.
  • Behandling af det faktiske indhold af en upload af flere dele.

Uploadformularen er den samme som den i det foregående afsnit.

Lad os gå videre til at oprette vores Jakarta EE-servlet.

I vores metode til anmodningsbehandling kan vi pakke det indgående HttpForespørgsel med en check for at se om det er en flerdelt upload.

Vi specificerer også, hvilke ressourcer der skal tildeles til filuploaden midlertidigt (mens de behandles) på vores DiskFileItemFactory.

Endelig vi opretter en ServletFileUpload objekt, der repræsenterer selve filen. Det vil eksponere indholdet af multidelt upload til den endelige persistens-serverside:

hvis (ServletFileUpload.isMultipartContent (anmodning)) {DiskFileItemFactory fabrik = ny DiskFileItemFactory (); factory.setSizeThreshold (MEMORY_THRESHOLD); factory.setRepository (ny fil (System.getProperty ("java.io.tmpdir")); ServletFileUpload upload = ny ServletFileUpload (fabrik); 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 udtrække dette indhold og skrive dem til disken:

hvis (ServletFileUpload.isMultipartContent (anmodning)) {// ... Liste formItems = upload.parseRequest (anmodning); 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 ("meddelelse", "Fil" + filnavn + "er uploadet med succes!"); }}}}

4. Kørsel af eksemplet

Efter at vi har samlet vores projekt til en .krig, kan vi slippe det i vores lokale Tomcat-instans og starte det.

Derfra kan vi hente hoveduploadvisningen, hvor vi får en formular:

Efter at have uploadet vores fil, skal vi se meddelelsen:

Endelig kan vi kontrollere den placering, der er angivet i vores servlet:

5. Konklusion

Det er det! Vi har lært at levere uploads med flere dele ved hjælp af Jakarta EE samt Apache's Common Fil upload bibliotek!

Kodestykker kan som altid findes på GitHub.