Dateien mit Servlets und JSP hochladen

Hochladen von Dateien mit Servlets und JSP

1. Einführung

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

Um dies zu erreichen, sehen wir zunächst die Vanilla Java EE-Lösung mit Funktionen zum Hochladen von Dateien, die durch die Annotation von native@MultipartConfigbereitgestellt werden.

Anschließend werden wir die Bibliothek von Apache CommonsFileUploadfür frühere Versionen der Servlet-API durchgehen.

2. Verwenden von Java EE@MultipartConfig

Ab Version 6 kann Java EE sofort mehrteilige Uploads unterstützen.

Daher ist es wahrscheinlich eine Standardeinstellung, wenn eine Java 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 Attributenctype=”multipart/form-data”definiert werden, um einen mehrteiligen Upload zu signalisieren.

Als nächsteswe’ll want to annotate our HttpServlet with the correct information using the @MultipartConfig annotation:

@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ßlichwe can easily retrieve our inbound File from the request using the getParts() method und speichern Sie es auf der Festplatte:

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 MethodePart.getSubmittedFileName()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 folgendenpom.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 undcommons-io.

3.2. Servlet hochladen

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

  • Ein Upload-Formular auf einer.jsp-Seite.

  • Konfigurieren Sie IhrDiskFileItemFactory- undServletFileUpload-Objekt.

  • Verarbeiten des tatsächlichen Inhalts eines mehrteiligen Datei-Uploads.

Das Upload-Formular ist dasselbe wie im vorherigen Abschnitt.

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

Bei unserer Anforderungsverarbeitungsmethode können wir die eingehendenHttpRequest mit einer Überprü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) auf unserenDiskFileItemFactory.zugewiesen werden sollen

Schließlichwe’ll create a ServletFileUpload object which will represent the actual file itself. 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. Beispiel ausführen

Nachdem wir unser Projekt in.war 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 ein Formular angezeigt wird:

image

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

image

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

image

5. Fazit

Das ist es! Wir haben gelernt, wie Sie mit Java EE mehrteilige Datei-Uploads sowie die CommonFileUpload-Bibliothek von Apache bereitstellen können!

Code-Schnipsel finden Sie wie immer inover on GitHub.