English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Servlet-Dateiupload

Servlet können mit HTML-Formular-Tags verwendet werden, um Benutzern das Hochladen von Dateien auf den Server zu ermöglichen. Hochgeladene Dateien können Textdateien, Bilddateien oder jede Art von Dokument sein.

Die in diesem Artikel verwendeten Dateien sind:

  • upload.jsp: Formular zur Dateiupload.

  • message.jsp: Seite, auf die nach dem Upload umgeleitet wird.

  • UploadServlet.java: Servlet zur Verarbeitung des Uploads.

  • Erforderliche jar-Datei: commons-fileupload-1.3.2、commons-io-2.5.jar

Die Struktur ist wie folgt dargestellt:

Hinweis:Servlet3Version 0.0 hat bereits die Eigenschaft des Dateiuploads integriert, und Entwickler müssen den Commons FileUpload-Komponente nicht mehr in das Projekt importieren.

Wir erläutern dies im Folgenden im Detail.

Ein Formular zur Dateiupload erstellen

Der folgende HTML-Code erstellt ein Formular zur Dateiupload. Folgende Punkte sollten beachtet werden:

  • 表单 method 属性应该设置为 POST Methode, das GET-Verfahren darf nicht verwendet werden.

  • 表单 enctype 属性应该设置为 multipart/form-data.

  • 表单 action 属性应该设置为在后端服务器上处理文件上传的 Servlet 文件。下面的示例使用了 UploadServlet Servlet 来上传文件。

  • 上传单个文件,您应该使用单个带有属性 type="file" 的 <input .../> 标签。为了允许多个文件上传,请包含多个 name 属性值不同的 input 标签。输入标签具有不同的名称属性的值。浏览器会为每个 input 标签关联一个浏览按钮。

upload.jsp 文件代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传示例 - 基础教程网</title>
</head>
<body>
<h1>文件上传示例 - 基础教程网</h1>
<form method="post" action="/TomcatTest/UploadServlet" enctype="multipart/form-data">
    选择一个文件:
    <input type="file" name="uploadFile" />
    <br/><br/>
    <input type="submit" value="上传" />
</form>
</body>
</html>

编写后台 Servlet

以下是 UploadServlet 的源代码,用于处理文件上传,在这之前我们先确保依赖包已经引入到项目的 WEB-INF/lib 目录下:

你可以直接下载本站提供的两个依赖包:

UploadServlet 的源代码如下所示:

package com.w;3codebox.test;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
 
/**
 * Servlet Implementierungsklasse UploadServlet
 */
@WebServlet("/UploadServlet)
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
     
    // Speicherort für hochgeladene Dateien
    private static final String UPLOAD_DIRECTORY = "upload";
 
    // Upload-Konfiguration
    private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3;  // 3MB
    private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
    private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB
 
    /**
     * Übertragen Sie Daten und speichern Sie Dateien
     */
    protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        // Überprüfen Sie, ob es sich um eine Multimediadateiübergabe handelt
        if (!ServletFileUpload.isMultipartContent(request)) {
            // wenn nicht, dann stoppen}}
            PrintWriter writer = response.getWriter();
            writer.println("Fehler: Das Formular muss enctype=multipart enthalten");/form-data");
            writer.flush();
            return;
        }
 
        // Upload-Parameter konfigurieren
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // Setzen der Speicher-Kritikalitäts阈值 - Übersteigt der Speicher, wird ein vorläufiges Datei erzeugt und im vorläufigen Verzeichnis gespeichert
        factory.setSizeThreshold(MEMORY_THRESHOLD);
        // Setzen des vorläufigen Speicherverzeichnisses
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
 
        ServletFileUpload upload = new ServletFileUpload(factory);
         
        // Setzen der maximalen Datei-Upload-Größe
        upload.setFileSizeMax(MAX_FILE_SIZE);
         
        // Setzen der maximalen Anfragegröße (enthält Datei und Formulardaten)
        upload.setSizeMax(MAX_REQUEST_SIZE);
        // Chinesische Verarbeitung
        upload.setHeaderEncoding("UTF-8); 
        // Erstellen eines vorläufigen Pfades, um hochgeladene Dateien zu speichern
        // Dieser Pfad ist relativ zum Verzeichnis der aktuellen Anwendung
        String uploadPath = request.getServletContext().getRealPath("./) + File.separator + UPLOAD_DIRECTORY;
       
         
        // Wenn der Ordner nicht existiert, wird er erstellt
        File uploadDir = new File(uploadPath);
        falls (!uploadDir.exists()) {
            uploadDir.mkdir();
        }
 
        try {
            // Daten des Antrags analysieren, um Dateidaten zu extrahieren
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);
 
            falls (formItems != null && formItems.size() > 0) {
                // Durchlaufen Sie die Formulardaten
                for (FileItem item : formItems) {
                    // Verarbeiten Sie die Felder, die nicht im Formular enthalten sind
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        String filePath = uploadPath + File.separator + fileName;
                        File storeFile = new File(filePath);
                        // Geben Sie den Uploadpfad auf der Konsole aus
                        System.out.println(filePath);
                        // Speichern Sie die Datei auf der Festplatte
                        item.write(storeFile);
                        request.setAttribute("message",
                            "Datei-Upload erfolgreich!");
                    }
                }
            }
        } catch (Exception ex) {
            request.setAttribute("message",
                    "Fehlermeldung: " + ex.getMessage());
        }
        // Springen Sie zu message.jsp
        message.jsp".forward(/request.getServletContext().getRequestDispatcher("
                request, response);
    }
}

message.jsp Datei-Code wie folgt:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Datei-Upload-Ergebnis</title>
</head>
<body>
    <center>
        <h2${message}</h2>
    </center>
</body>
</html>

Kompilieren und ausführen Sie den Servlet

Kompilieren Sie den obigen Servlet UploadServlet und erstellen Sie die erforderlichen Einträge im web.xml-Datei, wie folgt:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
  <servlet>
    <display-name>UploadServlet</display-name>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>com.w3codebox.test.UploadServlet</servlet-class>
  </servlet>
   
  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/TomcatTest/UploadServlet</url-pattern>
  </servlet-mapping>
</web-app>

Versuchen Sie jetzt, den Dateiupload mithilfe des HTML-Formulars, das Sie oben erstellt haben, auszuführen. Wenn Sie die folgenden Adresse im Browser aufrufen://localhost:8080/TomcatTest/upload.jsp , wie folgt dargestellt: