Téléchargement et chargement de fichiers JSP

⚡ Résumé intelligent

Le téléchargement et l'envoi de fichiers JSP sont des opérations d'entrée/sortie essentielles permettant à une application web de recevoir des fichiers des utilisateurs et de leur renvoyer des fichiers. Cette ressource explique ces deux flux à l'aide de formulaires d'action JSP, de la classe Apache Commons FileUpload et de classes de servlet, avec un code fonctionnel complet.

  • 📤 Principes de base du téléchargement : Utilisez la méthode POST et définissez enctype sur multipart/form-data pour tout téléchargement de fichier.
  • 🧩 Apache Commons : DiskFileItemFactory et ServletFileUpload analysent la requête multipart en éléments de fichier.
  • 🇧🇷 Gestion des servlets : La méthode doPost parcourt les éléments de fichier et écrit chacun d'eux dans un dossier cible.
  • (I.e. Télécharger Flow : Une servlet transmet un fichier en utilisant FileInputStream et l'en-tête Content-Disposition.
  • ⚙️ Configuration: Les chemins d'accès aux fichiers, les limites de taille et le type de contenu doivent être définis avant toute lecture ou écriture.

Téléchargement et chargement de fichiers JSP

Téléchargement de fichier JSP

  • Nous pouvons télécharger n'importe quel fichier en utilisant JSP.
  • Il peut s'agir d'un fichier texte, d'un fichier binaire, d'un fichier image ou de tout autre document.
  • Ici, en cas de téléchargement de fichiers, seule la méthode POST sera utilisée et non la méthode GET.
  • L'attribut Enctype doit être défini sur multipart/form-data.

Exemple : utilisation d'une action

Dans cet exemple, nous téléchargeons un fichier à l'aide de l'objet IO.

Action_file.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" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru File</title>
</head>
<body>
<a>Guru File Upload:</a>
Select file: <br />
<form action="action_file_upload.jsp" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>

Action_file_upload.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.apache.commons.io.output.*" %>
<!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=ISO-8859-1">
<title>Guru File Upload</title>
</head>
<body>
<%
   File file ;
   int maxFileSize = 5000 * 1024;
   int maxMemSize = 5000 * 1024;
   String filePath = "E:/guru99/data";

   String contentType = request.getContentType();
   if ((contentType.indexOf("multipart/form-data") >= 0)) {

      DiskFileItemFactory factory = new DiskFileItemFactory();
      factory.setSizeThreshold(maxMemSize);
      factory.setRepository(new File("c:\\temp"));
      ServletFileUpload upload = new ServletFileUpload(factory);
      upload.setSizeMax( maxFileSize );
      try{
         List fileItems = upload.parseRequest(request);
         Iterator i = fileItems.iterator();
         out.println("<html>");
         out.println("<body>");
         while ( i.hasNext () )
         {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () )  {
                String fieldName = fi.getFieldName();
                String fileName = fi.getName();
                boolean isInMemory = fi.isInMemory();
                long sizeInBytes = fi.getSize();
                file = new File( filePath + "yourFileName") ;
                fi.write( file ) ;
                out.println("Uploaded Filename: " + filePath + fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
      }catch(Exception ex) {
         System.out.println(ex);
      }
   }else{
      out.println("<html>");
      out.println("<body>");
      out.println("<p>No file uploaded</p>");
      out.println("</body>");
      out.println("</html>");
   }
%>
</body>
</html>

Explication du code :

Action_file.jsp

Code Ligne 12-18: Nous créons ici un formulaire avec un champ de fichier, qui téléchargera un fichier sur le serveur, et l'action sera transmise à action_file_upload.jsp.

Action_file_upload.jsp

Code Ligne 20: Ici, nous indiquons le chemin d'accès au fichier vers un emplacement spécifique.

Code Ligne 23-38: Nous vérifions ici si le type de contenu est multipart/form-data. Si c'est le cas, le contenu est de type fichier et il est lu. Une fois lu, le fichier est écrit dans un fichier temporaire, puis ce dernier est converti en fichier principal.

Lorsque vous exécutez le code ci-dessus, vous obtenez le résultat suivant :

Téléchargement de fichier JSP

Sortie :

Nous téléchargeons un fichier à l'aide de l'option « Choisir un fichier », et le bouton « Télécharger un fichier » transférera le fichier sur le serveur à l'emplacement indiqué.

Exemple : utilisation d'opérations JSP

Dans cet exemple, nous allons téléverser un fichier à l'aide des opérations JSP. Nous utiliserons un formulaire comportant un bouton « Téléverser », et lorsque vous cliquerez sur ce bouton, le fichier sera téléversé.

Téléchargement_1.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" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Uploading File</title>
</head>
<body>
File: <br />
<form action="guru_upload" method="post"
                        enctype="multipart/form-data">
<input type="file" name="guru_file" size="50" />
<br />
<input type="submit" value="Upload" />
</form>
</body>
</html>

Explication du code :

Code Ligne 11-12: Nous utilisons ici un formulaire associé à une action du servlet guru_upload, qui sera transmis via la méthode POST. L'attribut enctype spécifie le format d'encodage des données du formulaire avant leur envoi au serveur ; il est utilisé uniquement avec la méthode POST. Nous le définissons ici sur multipart/form-data, ce qui est approprié pour les fichiers volumineux.

Code Ligne 13: Ici, nous spécifions l'élément guru_file de type fichier et indiquons une taille de 50.

Code Ligne 15: Il s'agit d'un bouton de soumission portant le nom « Téléverser », qui permettra d'appeler le servlet d'action, de traiter la requête et de lire et écrire le fichier dans ce servlet.

Guru_upload.java

package demotest;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
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;

public class guru_upload extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public guru_upload() {
        super();
        // TODO Auto-generated constructor stub
    }
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		        if(ServletFileUpload.isMultipartContent(request)){
		            try {
		                List <FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
		                for(FileItem item : multiparts){
		                    if(!item.isFormField()){
		                        String name = new File(item.getName()).getName();
		                        item.write( new File("c:/guru/upload" + File.separator + name));
		                    }
		                }
		               //File uploaded successfully
		               request.setAttribute("gurumessage", "File Uploaded Successfully");
		            } catch (Exception ex) {
		               request.setAttribute("gurumessage", "File Upload Failed due to " + ex);
		            }
		        }else{

		            request.setAttribute("gurumessage","No File found");
 }
		        request.getRequestDispatcher("/result.jsp").forward(request, response);

		    }


}

Explication du code :

Code Ligne 12-14: Nous devrons ici importer la bibliothèque org.apache.commons dans la configuration du code. Nous devrons importer la classe fileupload de cette bibliothèque.

Code Ligne 23: Nous avons ici la méthode doPost(), qui sera appelée lorsque nous passerons la méthode POST dans JSP, et qui prendra les objets de requête et de réponse comme paramètres.

Code Ligne 26: Nous créons ici un objet de la classe ServletFileUpload du package fileUpload de la bibliothèque org.apache.commons, qui vérifiera la présence d'objets fichier dans la JSP. Si des objets fichier sont trouvés, ils seront extraits de la requête.

Code Ligne 27-32: Nous allons parcourir le nombre de fichiers en vérifiant combien d'éléments sont présents dans l'objet `multiparts`, qui est une liste (si plusieurs fichiers sont téléchargés), et les enregistrer dans le dossier `c:/guru/upload` sous le nom de fichier fourni. Nous écrivons le fichier dans le dossier indiqué à l'aide de la méthode `write` de l'objet fichier.

Code Ligne 34: S'il n'y a pas d'exception, nous définissons un attribut dans la requête sous la forme gurumessage avec la valeur « Fichier téléchargé avec succès ».

Code Ligne 35-36: En cas d'exception, un message « Échec du téléchargement du fichier » s'affiche.

Code Ligne 40: Si le fichier est introuvable, le message affiché sera « Fichier introuvable ».

Code Ligne 42: Transmission de la requête à l'aide de l'objet requestdispatcher vers result.jsp avec les objets request et response.

Résultat.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" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Result</title>
</head>
<body>
<% String msg = (String)request.getAttribute("message");
   out.println(msg);
%>
</body>
</html>

Explication du code :

Code Ligne 10: Ici, nous récupérons l'attribut de l'objet requête avec la valeur gurumessage dans un objet chaîne de caractères.

Code Ligne 11: Ici, nous imprimons ce message.

Lorsque nous exécutons le code ci-dessus, nous obtenons le résultat suivant :

Sortie :

On obtient un formulaire comportant des champs permettant de sélectionner un fichier dans le répertoire. Une fois le fichier sélectionné, il faut cliquer sur le bouton « Téléverser ».

Téléchargement de fichiers à l'aide d'opérations JSP

Une fois que l'on clique sur le bouton de téléchargement, on reçoit le message confirmant que le fichier a été téléchargé avec succès.

Téléchargement de fichiers à l'aide d'opérations JSP

Dans le schéma ci-dessous, nous pouvons voir que le fichier a été téléchargé dans le dossier c:/guru/upload.

Téléchargement de fichiers à l'aide d'opérations JSP

Téléchargement du fichier JSP

Dans cet exemple, nous allons télécharger un fichier depuis un répertoire en cliquant sur le bouton.

Téléchargement_1.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" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Downloading Guru Example</title>
</head>
<body>
Guru Downloading File<a href="guru_download">Download here!!!</a>
</body>
</html>

Explication du code :

Code Ligne 10: Nous vous proposons ici un lien pour télécharger un fichier depuis le dossier c:/guru/upload en utilisant le servlet guru_download.

Guru_download.java

package demotest;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class guru_download
 */
public class guru_download extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String gurufile = "test.txt";
		String gurupath = "c:/guru/upload/";
		response.setContentType("APPLICATION/OCTET-STREAM");
		response.setHeader("Content-Disposition", "attachment; filename=\""
				+ gurufile + "\"");

		FileInputStream fileInputStream = new FileInputStream(gurupath
				+ gurufile);

		int i;
		while ((i = fileInputStream.read()) != -1) {
			out.write(i);
		}
		fileInputStream.close();
		out.close();
	}


	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

Explication du code :

Code Ligne 3-5: Nous importons ici FileInputStream, IOException et Print.Writer du package java.io.

Code Ligne 15: Nous sommes en train de définir le guru_download servlet qui étend HttpServlet.

Code Ligne 18: Comme nous l'avons défini, un href sera inclus dans un URLLa méthode GET sera donc traitée (doGet sera appelée dans la servlet), ce qui inclut également les objets de requête et de réponse.

Code Ligne 19-20: Nous définissons le type de contenu dans l'objet de réponse et récupérons également l'objet writer à partir de la réponse.

Code Ligne 21-22: Définition d'une variable nommée gurufile avec la valeur test.txt et gurupath comme c:/guru/upload/.

Code Ligne 23-25: Nous définissons le type de contenu à l'aide de l'objet de réponse, et nous utilisons la méthode setHeader, qui définit l'en-tête dans l'objet de réponse comme étant le nom du fichier qui a été téléchargé.

Code Ligne 27-28: Nous créons un FileInputStream dans lequel nous ajouterons gurupath+gurufile.

Code Ligne 31-33: Ici, nous avons pris un boucle tout en qui s'exécutera jusqu'à ce que le fichier soit lu, d'où la condition != -1. Dans cette condition, nous écrivons à l'aide de l'objet printwriter out.

Lorsque vous exécuterez le code ci-dessus, vous obtiendrez le résultat suivant :

Sortie :

Téléchargement de fichier

Il faut cliquer sur downloading_1.jsp pour obtenir un lien « Télécharger ici ». En cliquant sur ce lien, le fichier sera téléchargé sur votre ordinateur.

FAQ

Oui. Les assistants IA peuvent générer des servlets et des formulaires JSP pour le téléchargement et l'envoi de fichiers, ajouter la logique Apache Commons FileUpload et suggérer des validations. Il est néanmoins recommandé de tester le code et de vérifier les chemins d'accès aux fichiers ainsi que les limites de taille.

Oui. Les scanners basés sur l'IA peuvent analyser les fichiers téléchargés afin de détecter les logiciels malveillants, les types de fichiers inattendus ou les charges utiles surdimensionnées avant leur stockage. Cela ajoute une couche de protection, même si la validation côté serveur du type et de la taille reste essentielle.

L'encodage multipart/form-data divise la requête en parties afin que les données de fichier binaire soient transmitLe fichier ted doit être intact. Sans lui, le navigateur n'envoie au serveur que le nom du fichier, et non son contenu.

Apache Commons FileUpload, associé à Commons IO, est largement utilisé. Il analyse les requêtes multipart, expose chaque FileItem et écrit le contenu téléchargé dans un répertoire choisi sur le serveur.

Résumez cet article avec :