Hochladen von Dateien mit Servlets und JSP

1. Einleitung

In diesem kurzen Tutorial erfahren Sie, wie Sie eine Datei von einem Servlet hochladen.

Um dies zu erreichen, sehen wir zuerst die Vanilla Jakarta EE-Lösung mit Datei-Upload-Funktionen, die durch die native Annotation @MultipartConfig bereitgestellt werden .

Anschließend werden wir die Apache Commons FileUpload- Bibliothek für frühere Versionen der Servlet-API durchgehen .

2. Verwenden von Jakarta EE @MultipartConfig

Jakarta EE bietet die Möglichkeit, sofort mehrteilige Uploads zu unterstützen.

Daher ist es wahrscheinlich eine Standardeinstellung, wenn eine Jakarta EE-App mit Unterstützung für das Hochladen von Dateien angereichert wird.

Fügen wir zunächst unserer HTML-Datei ein Formular hinzu:

 Choose a file:   

Das Formular sollte mit dem Attribut enctype = "multipart / form-data" definiert werden, um einen mehrteiligen Upload zu signalisieren.

Als Nächstes möchten wir unser HttpServlet mit den richtigen Informationen unter Verwendung der Annotation @MultipartConfig mit Anmerkungen versehen :

@MultipartConfig(fileSizeThreshold = 1024 * 1024, maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5) public class MultipartServlet extends HttpServlet { //... } 

Stellen Sie dann sicher, dass unser Standard-Server-Upload-Ordner festgelegt ist:

String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = new File(uploadPath); if (!uploadDir.exists()) uploadDir.mkdir(); 

Schließlich können wir unsere eingehende Datei mit der Methode getParts () einfach aus der Anforderung abrufen und auf der Festplatte speichern:

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

Beachten Sie, dass wir in diesem Beispiel eine Hilfsmethode getFileName () verwenden:

private String getFileName(Part part) { for (String content : part.getHeader("content-disposition").split(";")) { if (content.trim().startsWith("filename")) return content.substring(content.indexOf("=") + 2, content.length() - 1); } return Constants.DEFAULT_FILENAME; }

Für Servlet 3.1. In Projekten können wir alternativ die Part.getSubmittedFileName () -Methode verwenden:

fileName = part.getSubmittedFileName();

3. Verwenden von Apache Commons FileUpload

Wenn wir uns nicht in einem Servlet 3.0-Projekt befinden, können wir die Apache Commons FileUpload-Bibliothek direkt verwenden.

3.1. Konfiguration

Wir möchten die folgenden pom.xml- Abhängigkeiten verwenden, um unser Beispiel zum Laufen zu bringen:

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

Die neuesten Versionen können mit einer Schnellsuche im zentralen Repository von Maven gefunden werden: commons-fileupload und commons-io.

3.2. Servlet hochladen

Die drei Hauptteile für die Integration der FileUpload- Bibliothek von Apache lauten wie folgt:

  • Ein Upload-Formular auf einer .jsp- Seite.
  • Konfigurieren Ihres DiskFileItemFactory- und ServletFileUpload- Objekts.
  • Verarbeiten des tatsächlichen Inhalts eines mehrteiligen Datei-Uploads.

Das Upload-Formular ist das gleiche wie im vorherigen Abschnitt.

Fahren wir mit der Erstellung unseres Jakarta EE-Servlets fort.

In unserer Anforderungsverarbeitungsmethode können wir die eingehende HttpRequest mit einer Prüfung versehen, um festzustellen , ob es sich um einen mehrteiligen Upload handelt.

Wir geben auch an, welche Ressourcen dem Datei-Upload vorübergehend (während der Verarbeitung) in unserer DiskFileItemFactory zugewiesen werden sollen.

Zuletzt erstellen wir ein ServletFileUpload- Objekt, das die eigentliche Datei selbst darstellt . Der Inhalt des mehrteiligen Uploads wird für die endgültige Persistenzserverseite verfügbar gemacht:

if (ServletFileUpload.isMultipartContent(request)) { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(MEMORY_THRESHOLD); factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); upload.setFileSizeMax(MAX_FILE_SIZE); upload.setSizeMax(MAX_REQUEST_SIZE); String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = new File(uploadPath); if (!uploadDir.exists()) { uploadDir.mkdir(); } //... }

Und dann können wir diese Inhalte extrahieren und auf die Festplatte schreiben:

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(); String filePath = uploadPath + File.separator + fileName; File storeFile = new File(filePath); item.write(storeFile); request.setAttribute("message", "File " + fileName + " has uploaded successfully!"); } } } }

4. Ausführen des Beispiels

Nachdem wir unser Projekt in eine .war-Datei kompiliert haben , können wir es in unserer lokalen Tomcat-Instanz ablegen und starten.

Von dort aus können wir die Hauptansicht zum Hochladen aufrufen, in der uns ein Formular angezeigt wird:

Nach dem erfolgreichen Hochladen unserer Datei sollte die folgende Meldung angezeigt werden:

Zuletzt können wir den in unserem Servlet angegebenen Speicherort überprüfen:

5. Schlussfolgerung

Das ist es! Wir haben gelernt, wie Sie mehrteilige Datei-Uploads mit Jakarta EE sowie der Common FileUpload- Bibliothek von Apache bereitstellen können !

Code-Schnipsel finden Sie wie immer auf GitHub.