Servlet 3 Datei-Upload mit @MultipartConfig

Da der Datei-Upload eine gängige Aufgabe in Webanwendungen ist, bietet Servlet Specs 3.0 zusätzliche Unterstützung für das Hochladen von Dateien auf den Server, und wir müssen uns nicht auf APIs von Drittanbietern verlassen. In diesem Tutorial werden wir sehen, wie wir die Servlet 3.0 API verwenden können, um Dateien auf den Server hochzuladen.

MultipartConfig

Wir müssen den File-Upload-Handler-Servlet mit der Annotation MultipartConfig versehen, um multipart/form-data-Anfragen zu behandeln, die für das Hochladen von Dateien auf den Server verwendet werden. Die Annotation MultipartConfig hat folgende Attribute:

  • fileSizeThreshold: Wir können den Schwellenwert für die Größe angeben, nach dessen Überschreiten die Datei auf die Festplatte geschrieben wird. Der Größenwert ist in Bytes, also ist 1024*1024*10 10 MB.
  • location: Verzeichnis, in dem Dateien standardmäßig gespeichert werden, der Standardwert ist “”.
  • maxFileSize: Maximale Größe, die für das Hochladen einer Datei erlaubt ist, der Wert wird in Bytes angegeben. Der Standardwert ist -1L, was unbegrenzt bedeutet.
  • maxRequestSize: Maximale Größe, die für eine multipart/form-data-Anfrage erlaubt ist. Der Standardwert ist -1L, was unbegrenzt bedeutet.

Part Interface

Das Part Interface repräsentiert einen Teil oder ein Formularelement, das innerhalb einer multipart/form-data POST-Anfrage empfangen wurde. Einige wichtige Methoden sind getInputStream(), write(String fileName), die wir verwenden können, um Dateien zu lesen und zu schreiben.

Änderungen bei HttpServletRequest

In HttpServletRequest wurden neue Methoden hinzugefügt, um alle Teile in einer multipart/form-data-Anfrage über die Methode getParts() zu erhalten. Wir können einen spezifischen Teil mit der Methode getPart(String partName) erhalten. Sehen wir uns ein einfaches Projekt an, in dem wir die oben genannten API-Methoden verwenden werden, um eine Datei mit Servlet hochzuladen. Unsere Projektstruktur wird wie das untenstehende Bild aussehen.

Servlet File Upload Project

HTML-Formular

Wir haben eine einfache HTML-Seite, auf der wir die Datei auswählen können, die hochgeladen werden soll, und eine Anfrage an den Server senden, um sie hochzuladen. index.html

<html>
        <head></head>
        <body>
        <form action="FileUploadServlet" method="post" enctype="multipart/form-data">
        Select File to Upload:<input type="file" name="fileName">
        <br>
        <input type="submit" value="Upload">
        </form>
        </body>
        </html>

File Upload Servlet

Hier ist unsere Implementierung des File Upload Servlets. FileUploadServlet.java

package com.journaldev.servlet;
 
import java.io.File;
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
 
@WebServlet("/FileUploadServlet")
@MultipartConfig(fileSizeThreshold=1024*1024*10, 	// 10 MB 
                 maxFileSize=1024*1024*50,      	// 50 MB
                 maxRequestSize=1024*1024*100)   	// 100 MB
public class FileUploadServlet extends HttpServlet {
 
    private static final long serialVersionUID = 205242440643911308L;
	
    /**
     * Directory where uploaded files will be saved, its relative to
     * the web application directory.
     */
    private static final String UPLOAD_DIR = "uploads";
     
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // gets absolute path of the web application
        String applicationPath = request.getServletContext().getRealPath("");
        // constructs path of the directory to save uploaded file
        String uploadFilePath = applicationPath + File.separator + UPLOAD_DIR;
         
        // creates the save directory if it does not exists
        File fileSaveDir = new File(uploadFilePath);
        if (!fileSaveDir.exists()) {
            fileSaveDir.mkdirs();
        }
        System.out.println("Upload File Directory="+fileSaveDir.getAbsolutePath());
        
        String fileName = null;
        //Get all the parts from request and write it to the file on server
        for (Part part : request.getParts()) {
            fileName = getFileName(part);
            part.write(uploadFilePath + File.separator + fileName);
        }
 
        request.setAttribute("message", fileName + " File uploaded successfully!");
        getServletContext().getRequestDispatcher("/response.jsp").forward(
                request, response);
    }
 
    /**
     * Utility method to get file name from HTTP header content-disposition
     */
    private String getFileName(Part part) {
        String contentDisp = part.getHeader("content-disposition");
        System.out.println("content-disposition header= "+contentDisp);
        String[] tokens = contentDisp.split(";");
        for (String token : tokens) {
            if (token.trim().startsWith("filename")) {
                return token.substring(token.indexOf("=") + 2, token.length()-1);
            }
        }
        return "";
    }
}

Beachten Sie die Verwendung der Annotation @MultipartConfig, um verschiedene Größenparameter für die hochzuladende Datei festzulegen. Wir müssen den Request-Header „content-disposition“ verwenden, um den vom Client gesendeten Dateinamen zu erhalten, wir werden die Datei unter demselben Namen speichern. Der Verzeichnisort ist relativ zur Webanwendung, wo ich die Datei speichere, Sie können ihn aber auch an einen anderen Ort konfigurieren, wie im Beispiel von Apache Commons FileUpload.

Antwort JSP

Eine einfache JSP-Seite, die als Antwort an den Client gesendet wird, sobald die Datei erfolgreich auf den Server hochgeladen wurde. response.jsp

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
        <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
        "https://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <title>Upload File Response</title>
        </head>
        <body>
        <%-- Using JSP EL to get message attribute value from request scope --%>
        <h2>${requestScope.message}</h2>
        </body>
        </html>

Deployment Descriptor

Im web.xml-File für den Servlet-Dateiupload gibt es nichts Neues, es wird nur verwendet, um die index.html als Willkommensdatei einzurichten. web.xml

  <?xml version="1.0" encoding="UTF-8"?>
        <web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
          <display-name>ServletFileUploadExample</display-name>
          <welcome-file-list>
            <welcome-file>index.html</welcome-file>
          </welcome-file-list>
        </web-app>

Wenn wir nun die Anwendung ausführen, erhalten wir folgende Seiten als Antwort.

File Upload HTML

Servlet File Upload Success

Die Logs zeigen den Verzeichnisort, an dem die Datei gespeichert wird, und Informationen zum Content-Disposition-Header.

Upload File Directory=/Users/pankaj/Documents/workspace/j2ee/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ServletFileUploadExample/uploads
content-disposition header= form-data; name="fileName"; filename="IMG_2046.jpg"

Ich führe Tomcat über Eclipse aus, deshalb ist der Dateiort so. Wenn Sie Tomcat über die Kommandozeile ausführen und die Anwendung durch Exportieren als WAR-Datei in das Verzeichnis webapps bereitstellen, erhalten Sie eine andere Struktur, aber eine klare.

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren:

centron Managed Cloud Hosting in Deutschland

Java-Array: So prüfst du Werte effizient

JavaScript
Wie prüft man, ob ein Java Array einen Wert enthält? Es gibt viele Möglichkeiten, um zu überprüfen, ob ein Java Array einen bestimmten Wert enthält. Einfache Iteration mit einer for-Schleife…