Aujourd’hui, nous examinerons un exemple de téléchargement de fichier Servlet 3 en utilisant l’annotation @MultipartConfig et javax.servlet.http.Part
. Il y a quelque temps, j’ai écrit un article sur le téléchargement de fichiers Servlet et j’ai utilisé l’API Apache FileUpload, mais ici nous utiliserons la fonctionnalité de téléchargement de fichiers Servlet 3.
Téléchargement de fichiers Servlet 3
Étant donné que le téléchargement de fichiers est une tâche courante dans les applications web, les spécifications Servlet 3.0 ont fourni un support supplémentaire pour le téléchargement de fichiers sur le serveur et nous n’avons pas besoin de dépendre d’API tierces pour cela. Dans ce tutoriel, nous verrons comment utiliser l’API Servlet 3.0 pour télécharger des fichiers sur le serveur.
MultipartConfig
Nous devons annoter le servlet gestionnaire de téléchargement de fichiers avec l’annotation MultipartConfig pour gérer les requêtes multipart/form-data utilisées pour télécharger des fichiers sur le serveur. L’annotation MultipartConfig a les attributs suivants:
- fileSizeThreshold: Nous pouvons spécifier le seuil de taille après lequel le fichier sera écrit sur le disque. La valeur de taille est en octets, donc 1024*1024*10 représente 10 Mo.
- emplacement : Répertoire où les fichiers seront stockés par défaut, sa valeur par défaut est « ».
- maxFileSize : Taille maximale autorisée pour télécharger un fichier, sa valeur est fournie en octets. Sa valeur par défaut est -1L signifie illimitée.
- maxRequestSize : Taille maximale autorisée pour une demande multipart/form-data. La valeur par défaut est -1L, ce qui signifie illimitée.
En savoir plus sur les annotations à Tutoriel sur les Annotations Java.
Interface Partie
L’interface Partie représente une partie ou un élément de formulaire qui a été reçu dans une demande POST multipart/form-data. Certains méthodes importantes sont getInputStream()
, write(String fileName)
que nous pouvons utiliser pour lire et écrire un fichier.
Changements HttpServletRequest
De nouvelles méthodes ont été ajoutées dans HttpServletRequest
pour obtenir toutes les parties dans une requête multipart/form-data grâce à la méthode getParts()
. Nous pouvons obtenir une partie spécifique en utilisant la méthode getPart(String partName)
. Voyons un projet simple où nous utiliserons les méthodes API ci-dessus pour télécharger un fichier à l’aide d’un servlet. Notre structure de projet ressemblera à l’image ci-dessous.
Formulaire HTML
Nous avons une page html simple où nous pouvons sélectionner le fichier à télécharger et envoyer une demande au serveur pour le télécharger. 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>
Servelet de Téléchargement de Fichier
Voici l’implémentation de notre servlet de téléchargement de fichier. 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 {
// obtient le chemin absolu de l'application web
String applicationPath = request.getServletContext().getRealPath("");
// construit le chemin du répertoire pour enregistrer le fichier téléchargé
String uploadFilePath = applicationPath + File.separator + UPLOAD_DIR;
// crée le répertoire de sauvegarde s'il n'existe pas
File fileSaveDir = new File(uploadFilePath);
if (!fileSaveDir.exists()) {
fileSaveDir.mkdirs();
}
System.out.println("Upload File Directory="+fileSaveDir.getAbsolutePath());
String fileName = null;
//Obtient toutes les parties de la requête et les écrit dans le fichier sur le serveur
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 "";
}
}
Remarquez l’utilisation de l’annotation @MultipartConfig pour spécifier différents paramètres de taille pour le téléchargement de fichiers. Nous devons utiliser l’attribut « content-disposition » de l’en-tête de requête pour obtenir le nom du fichier envoyé par le client, nous enregistrerons le fichier avec le même nom. L’emplacement du répertoire est relatif à l’application web où je sauvegarde le fichier, vous pouvez le configurer vers un autre emplacement comme dans l’exemple Apache Commons FileUpload.
Response JSP
A simple JSP page that will be sent as response to client once the file is uploaded successfully to server. 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>
Descripteur de déploiement
Il n’y a rien de nouveau dans le fichier web.xml pour le téléchargement de fichiers servlet, il est uniquement utilisé pour faire de index.html le fichier de bienvenue. 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>
Maintenant, lorsque nous exécutons l’application, nous obtenons les pages suivantes en réponse.
Les journaux afficheront l’emplacement du répertoire où le fichier est enregistré et les informations d’en-tête « content-disposition ».
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"
I am running Tomcat through Eclipse, that’s why file location is like this. If you run tomcat through command line and deploy application by exporting as WAR file into webapps directory, you will get different structure but a clear one.
Télécharger le projet de téléchargement de fichiers multipartite Servlet 3
Source:
https://www.digitalocean.com/community/tutorials/servlet-3-file-upload-multipartconfig-part