JSP -Dateiupload

JSP kann mit dem HTML-Formular-Tag verwendet werden, damit Benutzer Dateien auf den Server hochladen können. Bei den hochgeladenen Dateien kann es sich um Textdateien, Bilddateien oder beliebige Dokumente handeln.

In diesem Kapitel verwenden wir Servlet, um Dateiuploads zu verarbeiten. Die verwendeten Dateien sind:

  • upload.jsp: das Dateiupload-Formular.
  • message.jsp: die Weiterleitungsseite nach erfolgreichem Upload.
  • UploadServlet.java: das Servlet zur Verarbeitung des Uploads.
  • Erforderliche JAR-Dateien: commons-fileupload-1.3.2, commons-io-2.5.jar.

Das Strukturdiagramm sieht wie folgt aus:

Als Nächstes werden wir es im Detail vorstellen.


Ein Dateiupload-Formular erstellen

Der folgende HTML-Code erstellt ein Dateiupload-Formular. Die folgenden Punkte sind zu beachten:

  • Formularmethod-Attribut sollte aufPOST-Methode gesetzt werden, die GET-Methode kann nicht verwendet werden.
  • Formularenctype-Attribut sollte aufmultipart/form-data gesetzt werden.
  • Formularaction-Attribut sollte auf die Servlet-Datei gesetzt werden, die den Dateiupload auf dem Backend-Server verarbeitet. Das folgende Beispiel verwendetUploadServletServlet zum Hochladen von Dateien.
  • Um eine einzelne Datei hochzuladen, sollten Sie ein einzelnes <input .../>-Tag mit dem Attribut type="file" verwenden. Um mehrere Dateiuploads zu ermöglichen, fügen Sie mehrere input-Tags mit unterschiedlichen name-Attributwerten ein. Die input-Tags haben unterschiedliche name-Attributwerte. Der Browser ordnet jedem input-Tag eine Schaltfläche „Durchsuchen“ zu.

Der Code der Datei upload.jsp lautet 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>文件上传实例 - Example</title>
</head>
<body>
<h1>文件上传实例 - Example</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>

Backend-Servlet schreiben

Das Folgende ist der Quellcode von UploadServlet, der zum Verarbeiten von Dateiuploads verwendet wird. Zuvor stellen wir zunächst sicher, dass die Abhängigkeitspakete in das Verzeichnis WEB-INF/lib des Projekts importiert wurden:

Sie können die beiden von dieser Website bereitgestellten Abhängigkeitspakete direkt herunterladen:

  • commons-fileupload-1.3.2.jar
  • commons-io-2.5.jar

Der Quellcode von UploadServlet lautet wie folgt:

package com.example.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 implementation class UploadServlet
 */

// 如果不配置 web.xml ,可以使用下面的代码
// @WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
     
    // 上传文件存储目录
    private static final String UPLOAD_DIRECTORY = "upload";
 
    // 上传配置
    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
 
    /**
     * 上传数据及保存文件
     */
    protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        // 检测是否为多媒体上传
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 如果不是则停止
            PrintWriter writer = response.getWriter();
            writer.println("Error: 表单必须包含 enctype=multipart/form-data");
            writer.flush();
            return;
        }
 
        // 配置上传参数
        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);
        
        // 中文处理
        upload.setHeaderEncoding("UTF-8"); 

        // 构造临时路径来存储上传的文件
        // 这个路径相对当前应用的目录
        String uploadPath = getServletContext().getRealPath("/") + File.separator + UPLOAD_DIRECTORY;
       
         
        // 如果目录不存在则创建
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }
 
        try {
            // 解析请求的内容提取文件数据
            @SuppressWarnings("unchecked")
            List<FileItem> 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);
                        // 在控制台输出文件的上传路径
                        System.out.println(filePath);
                        // 保存文件到硬盘
                        item.write(storeFile);
                        request.setAttribute("message",
                            "文件上传成功!");
                    }
                }
            }
        } catch (Exception ex) {
            request.setAttribute("message",
                    "错误信息: " + ex.getMessage());
        }
        // 跳转到 message.jsp
        getServletContext().getRequestDispatcher("/message.jsp").forward(
                request, response);
    }
}

Der Code der Datei message.jsp lautet 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>文件上传结果</title>
</head>
<body>
    <center>
        <h2>${message}</h2>
    </center>
</body>
</html>

Kompilieren und führen Sie das Servlet aus

Kompilieren Sie das obige Servlet UploadServlet und erstellen Sie den erforderlichen Eintrag in der Datei web.xml 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.example.test.UploadServlet</servlet-class>
  </servlet>
   
  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/TomcatTest/UploadServlet</url-pattern>
  </servlet-mapping>
</web-app>

Versuchen Sie nun, eine Datei mit dem HTML-Formular hochzuladen, das Sie oben erstellt haben. Wenn Sie in Ihrem Browser auf http://localhost:8080/TomcatTest/upload.jsp zugreifen, sieht die Demo wie folgt aus:

Weitere Erweiterungen