Servlets - Téléchargement de fichiers

Un servlet peut être utilisé avec une balise de formulaire HTML pour permettre aux utilisateurs de télécharger des fichiers sur le serveur. Un fichier téléchargé peut être un fichier texte ou un fichier image ou tout autre document.

Création d'un formulaire de téléchargement de fichier

Le code HTM suivant ci-dessous crée un formulaire de téléchargement. Voici les points importants à noter -

  • La forme method l'attribut doit être défini sur POST la méthode et la méthode GET ne peuvent pas être utilisées

  • La forme enctype l'attribut doit être défini sur multipart/form-data.

  • La forme actionL'attribut doit être défini sur un fichier de servlet qui gérerait le téléchargement de fichiers sur le serveur principal. L'exemple suivant utiliseUploadServlet servlet pour télécharger le fichier.

  • Pour télécharger un seul fichier, vous devez utiliser une seule balise <input ... /> avec l'attribut type = "file". Pour autoriser le téléchargement de plusieurs fichiers, incluez plusieurs balises d'entrée avec des valeurs différentes pour l'attribut de nom. Le navigateur associe un bouton Parcourir à chacun d'eux.

<html>
   <head>
      <title>File Uploading Form</title>
   </head>
   
   <body>
      <h3>File Upload:</h3>
      Select a file to upload: <br />
      <form action = "UploadServlet" method = "post" enctype = "multipart/form-data">
         <input type = "file" name = "file" size = "50" />
         <br />
         <input type = "submit" value = "Upload File" />
      </form>
   </body>
</html>

Cela affichera le résultat suivant qui permettrait de sélectionner un fichier à partir du PC local et lorsque l'utilisateur cliquera sur "Télécharger le fichier", le formulaire sera soumis avec le fichier sélectionné -

File Upload: 
Select a file to upload: 


NOTE: This is just dummy form and would not work.

Écriture d'un servlet backend

Voici le servlet UploadServletqui prendrait soin d'accepter le fichier téléchargé et de le stocker dans le répertoire <Tomcat-installation-directory> / webapps / data. Ce nom de répertoire peut également être ajouté à l'aide d'une configuration externe telle qu'uncontext-param élément dans web.xml comme suit -

<web-app>
   ....
   <context-param> 
      <description>Location to store uploaded file</description> 
      <param-name>file-upload</param-name> 
      <param-value>
         c:\apache-tomcat-5.5.29\webapps\data\
      </param-value> 
   </context-param>
   ....
</web-app>

Voici le code source de UploadServlet qui peut gérer plusieurs fichiers à la fois. Avant de continuer, assurez-vous que les éléments suivants -

  • L'exemple suivant dépend de FileUpload, assurez-vous donc de disposer de la dernière version de commons-fileupload.x.x.jarfichier dans votre chemin de classe. Vous pouvez le télécharger surhttps://commons.apache.org/fileupload/.

  • FileUpload dépend de Commons IO, alors assurez-vous d'avoir la dernière version de commons-io-x.x.jarfichier dans votre chemin de classe. Vous pouvez le télécharger surhttps://commons.apache.org/io/.

  • Lors du test de l'exemple suivant, vous devez télécharger un fichier dont la taille est inférieure à maxFileSize, sinon le fichier ne sera pas téléchargé.

  • Assurez-vous d'avoir créé les répertoires c: \ temp et c: \ apache-tomcat8.0.28 \ webapps \ data bien à l'avance.

// Import required java libraries
import java.io.*;
import java.util.*;
 
import javax.servlet.ServletConfig;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {
   
   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath = getServletContext().getInitParameter("file-upload"); 
   }
   
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, java.io.IOException {
   
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
   
      if( !isMultipart ) {
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>No file uploaded</p>"); 
         out.println("</body>");
         out.println("</html>");
         return;
      }
  
      DiskFileItemFactory factory = new DiskFileItemFactory();
   
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
   
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
   
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try { 
         // Parse the request to get file items.
         List fileItems = upload.parseRequest(request);
	
         // Process the uploaded file items
         Iterator i = fileItems.iterator();

         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
   
         while ( i.hasNext () ) {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () ) {
               // Get the uploaded file parameters
               String fieldName = fi.getFieldName();
               String fileName = fi.getName();
               String contentType = fi.getContentType();
               boolean isInMemory = fi.isInMemory();
               long sizeInBytes = fi.getSize();
            
               // Write the file
               if( fileName.lastIndexOf("\\") >= 0 ) {
                  file = new File( filePath + fileName.substring( fileName.lastIndexOf("\\"))) ;
               } else {
                  file = new File( filePath + fileName.substring(fileName.lastIndexOf("\\")+1)) ;
               }
               fi.write( file ) ;
               out.println("Uploaded Filename: " + fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
         } catch(Exception ex) {
            System.out.println(ex);
         }
      }
      
      public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, java.io.IOException {

         throw new ServletException("GET method used with " +
            getClass( ).getName( )+": POST method required.");
      }
   }
}

Compiler et exécuter un servlet

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

<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>

Essayez maintenant de télécharger des fichiers en utilisant le formulaire HTML que vous avez créé ci-dessus. Lorsque vous essayez http: // localhost: 8080 / UploadFile.htm, il affichera le résultat suivant qui vous aidera à télécharger n'importe quel fichier depuis votre machine locale.

File Upload: 

Select a file to upload:


Si votre script de servlet fonctionne correctement, votre fichier doit être téléchargé dans le répertoire c: \ apache-tomcat8.0.28 \ webapps \ data \.