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

Téléchargement de fichiers Servlet

Les Servlet peuvent être utilisées avec les balises HTML form pour permettre aux utilisateurs de télécharger des fichiers sur le serveur. Les fichiers téléchargés peuvent être des fichiers texte, des fichiers images ou tout type de document.

Les fichiers utilisés dans cet article sont :

  • upload.jsp : Formulaire de téléchargement de fichier.

  • message.jsp : Page de redirection après le téléchargement réussi.

  • UploadServlet.java : Servlet de traitement du téléchargement.

  • Les fichiers jar à inclure : commons-fileupload-1.3.2、commons-io-2.5.jar.

Le schéma de structure est comme suit :

Attention :Servlet30 est déjà intégré avec la fonction de téléchargement de fichier, les développeurs n'ont plus besoin d'importer le composant Commons FileUpload dans le projet.

Nous allons maintenant en détail.

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

Le code HTML suivant crée un formulaire de téléchargement de fichier. Voici quelques points à noter :

  • 表单 méthode 属性应该设置为 POST La méthode ne peut pas utiliser la méthode GET.

  • 表单 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 implémentation classe UploadServlet
 */
@WebServlet("/UploadServlet)
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
     
    // Répertoire de stockage des fichiers téléversés
    private static final String UPLOAD_DIRECTORY = "upload";
 
    // Configuration de téléversement
    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
 
    /**
     * Téléversement des données et sauvegarde des fichiers
     */
    protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        // Vérification si c'est un téléversement multimédia
        if (!ServletFileUpload.isMultipartContent(request)) {
            // sinon arrêter}}
            PrintWriter writer = response.getWriter();
            writer.println("Erreur : Le formulaire doit contenir enctype=multipart/form-data");
            writer.flush();
            return;
        }
 
        // Configurer les paramètres de téléchargement
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // Définir la valeur critique de la mémoire - Créer un fichier temporaire et le stocker dans le répertoire temporaire une fois dépassé
        factory.setSizeThreshold(MEMORY_THRESHOLD);
        // Définir le répertoire de stockage temporaire
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
 
        ServletFileUpload upload = new ServletFileUpload(factory);
         
        // Définir la valeur maximale de téléchargement de fichier
        upload.setFileSizeMax(MAX_FILE_SIZE);
         
        // Définir la valeur maximale de la requête (comprend les fichiers et les données du formulaire)
        upload.setSizeMax(MAX_REQUEST_SIZE);
        // Traitement des caractères chinois
        upload.setHeaderEncoding("UTF-8"); 
        // Construire un chemin temporaire pour stocker les fichiers téléchargés
        // Ce chemin est relatif au répertoire de l'application actuelle
        String uploadPath = request.getServletContext().getRealPath("./) + File.separator + UPLOAD_DIRECTORY;
       
         
        // Si le répertoire n'existe pas, le créer
        File uploadDir = new File(uploadPath);
        si (!uploadDir.exists()) {
            uploadDir.mkdir();
        }
 
        try {
            // Analyser le contenu de la requête pour extraire les données de fichier
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);
 
            si (formItems != null && formItems.size() > 0) {
                // Itérez sur les données du formulaire
                for (FileItem item : formItems) {
                    // Traitez les champs qui ne se trouvent pas dans le formulaire
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        String filePath = uploadPath + File.separator + fileName;
                        File storeFile = new File(filePath);
                        // Affichez le chemin d'accès au fichier téléversé dans la console
                        System.out.println(filePath);
                        // Enregistrez le fichier sur le disque dur
                        item.write(storeFile);
                        }
                            "Téléversement de fichier réussi !");
                    }
                }
            }
        catch (Exception ex) {
            }
                    request.setAttribute("message", + "Erreur : "
        }
        // ex.getMessage());
        Redirigez vers message.jsp/request.getServletContext().getRequestDispatcher("
                request, response);
    }
}

message.jsp Le code du fichier 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>Résultat du téléversement de fichier</title>
</head>
<body>
    <center>
        <h2${message}</h2>
    </center>
</body>
</html>

Compilez et exécutez le Servlet

Compilé le Servlet UploadServlet ci-dessus et créez les entrées nécessaires 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.w3codebox.test.UploadServlet</servlet-class>
  </servlet>
   
  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/TomcatTest/UploadServlet</url-pattern>
  </servlet-mapping>
</web-app>

Essayez maintenant d'utiliser le formulaire HTML créé ci-dessus pour télécharger un fichier. Lorsque vous accédez à : http://localhost:8080/TomcatTest/upload.jsp , comme démontré ci-dessous :