Servlet Téléchargement de fichiers

Une Servlet peut être utilisée avec la balise de formulaire HTML pour permettre aux utilisateurs de téléverser des fichiers vers le serveur. Le fichier téléversé peut être un fichier texte, un fichier image ou tout document.

Les fichiers utilisés dans cet article sont :

  • upload.jsp : formulaire de téléversement de fichier.
  • message.jsp : la page vers laquelle rediriger après un téléversement réussi.
  • UploadServlet.java : la Servlet de gestion du téléversement.
  • Fichiers jar requis : commons-fileupload-1.3.2, commons-io-2.5.jar.

Le schéma de structure est le suivant :

Remarque :Servlet 3.0 dispose d'une fonctionnalité intégrée de téléversement de fichiers, donc les développeurs n'ont plus besoin d'importer le composant Commons FileUpload dans le projet.

Ensuite, nous le présentons en détail.


Créer un formulaire de téléversement de fichier

Le code HTML suivant crée un formulaire de téléversement de fichier. Les points suivants nécessitent une attention particulière :

  • L'attributmethoddu formulaire doit être défini sur la méthodePOST; la méthode GET ne peut pas être utilisée.
  • L'attributenctypedu formulaire doit être défini surmultipart/form-data.
  • L'attributactiondu formulaire doit être défini sur le fichier Servlet qui gère le téléversement de fichiers sur le serveur backend. L'exemple suivant utilise le ServletUploadServletpour téléverser des fichiers.
  • Pour téléverser un seul fichier, vous devez utiliser une seule balise <input .../> avec l'attribut type="file". Pour permettre le téléversement de plusieurs fichiers, incluez plusieurs balises input avec des valeurs d'attribut name différentes. Les balises input ont des valeurs d'attribut name différentes. Le navigateur associera un bouton Parcourir à chaque balise input.

Le code du fichier upload.jsp est le suivant :

<%@ 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>

Écrire le Servlet backend

Voici le code source d'UploadServlet, qui gère le téléversement de fichiers. Avant cela, nous nous assurons d'abord que les paquets de dépendances ont été importés dans le répertoire WEB-INF/lib du projet :

Vous pouvez directement télécharger les deux paquets de dépendances fournis par ce site :

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

Le code source de UploadServlet est le suivant :

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
 */
@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 = request.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
        request.getServletContext().getRequestDispatcher("/message.jsp").forward(
                request, response);
    }
}

Le code du fichier message.jsp est le suivant :

<%@ 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>

Compiler et exécuter le Servlet

Compilez le Servlet UploadServlet ci-dessus, et créez l'entrée requise dans le fichier web.xml, comme suit :

<?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>

Essayez maintenant de téléverser des fichiers à l'aide du formulaire HTML que vous avez créé ci-dessus. Lorsque vous accédez à http://localhost:8080/TomcatTest/upload.jsp dans votre navigateur, la démonstration est la suivante :

Autres extensions