Téléchargement de fichiers de servlets


Servlet peut être utilisé avec la balise de formulaire HTML pour permettre aux utilisateurs de télécharger des fichiers sur le serveur. Le fichier téléchargé peut être un fichier texte, un fichier image ou n'importe quel document.

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

Le code HTML suivant crée un formulaire de téléchargement de fichier. Les points suivants doivent être notés : L'attribut

  • du formulaire method doit être défini sur la méthode POST, et la méthode GET ne peut pas être utilisé. L'attribut

  • formenctype doit être défini sur multipart/form-data.

  • form < L'attribut 🎜>action doit être défini sur le fichier servlet qui gère les téléchargements de fichiers sur le serveur backend. L'exemple ci-dessous utilise le servlet UploadServlet pour télécharger des fichiers.

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

  •  <html>
    <head>
    <title>文件上传表单</title>
    </head>
    <body>
    <h3>文件上传:</h3>
    请选择要上传的文件:<br />
    <form action="UploadServlet" method="post"
                            enctype="multipart/form-data">
    <input type="file" name="file" size="50" />
    <br />
    <input type="submit" value="上传文件" />
    </form>
    </body>
    </html>
Cela affichera les résultats suivants, permettant à l'utilisateur de sélectionner un fichier sur son ordinateur local. Lorsque l'utilisateur clique sur "Télécharger le fichier", le formulaire sera soumis avec le fichier. sélectionnés à partir de leur ordinateur local :

 <b>文件上传:</b> 
请选择要上传的文件:<br /> 
<input type="file" name="file" size="50" /> 
<br /> 
<input type="button" value="上传文件" /> 
<br /> 
注:这只是虚拟的表单,不会正常工作。

Écrire un servlet en arrière-plan

Ce qui suit est le servlet

UploadServlet, qui acceptera le fichier téléchargé et le stockera dans le répertoire < Répertoire d'installation Tomcat>/webapps/ dans les données. Ce nom de répertoire peut également être ajouté à l'aide d'une configuration externe, telle que l'élément context-param dans web.xml, comme indiqué ci-dessous :

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

Ce qui suit est le code source d'UploadServlet, qui peut traiter plusieurs téléchargements de fichiers. Avant de continuer, veuillez confirmer ce qui suit :

  • L'exemple ci-dessous dépend de FileUpload, alors assurez-vous d'avoir la dernière version de

    commons-fileupload sur votre chemin de classe x.x.jar<🎜. > fichier. Peut être téléchargé depuis http://commons.apache.org/fileupload/.

  • FileUpload dépend de Commons IO, alors assurez-vous d'avoir la dernière version du fichier
  • commons-io-x.x.jar

    dans votre chemin de classe. Peut être téléchargé depuis http://commons.apache.org/io/.

  • Lors du test de l'exemple suivant, la taille du fichier que vous téléchargez ne peut pas être supérieure à
  • maxFileSize

    , sinon le fichier ne sera pas téléchargé.

  • Veuillez vous assurer que les répertoires c:temp et c:apache-tomcat-5.5.29webappsdata ont été créés à l'avance.
  • // 导入必需的 java 库
    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( ){
          // 获取文件将被存储的位置
          filePath = 
                 getServletContext().getInitParameter("file-upload"); 
       }
       public void doPost(HttpServletRequest request, 
                   HttpServletResponse response)
                  throws ServletException, java.io.IOException {
          // 检查我们有一个文件上传请求
          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();
          // 文件大小的最大值将被存储在内存中
          factory.setSizeThreshold(maxMemSize);
          // Location to save data that is larger than 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("<head>");
          out.println("<title>Servlet upload</title>");  
          out.println("</head>");
          out.println("<body>");
          while ( i.hasNext () ) 
          {
             FileItem fi = (FileItem)i.next();
             if ( !fi.isFormField () )	
             {
                // 获取上传文件的参数
                String fieldName = fi.getFieldName();
                String fileName = fi.getName();
                String contentType = fi.getContentType();
                boolean isInMemory = fi.isInMemory();
                long sizeInBytes = fi.getSize();
                // 写入文件
                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.");
       } 
    }
  • Compilez et exécutez le servlet

Compilez le servlet UploadServlet ci-dessus et créez les entrées requises 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 un fichier en utilisant le formulaire HTML que vous avez créé ci-dessus. Lorsque vous visitez : http://localhost:8080/UploadFile.htm dans votre navigateur, il affichera le résultat suivant, qui vous aidera à télécharger n'importe quel fichier depuis votre ordinateur local.

 <b>文件上传:</b> 
请选择要上传的文件:<br /> 
<input type="file" name="file" size="50" /> 
<br /> 
<input type="button" value="上传文件" />

Si votre script Servelt fonctionne correctement, vos fichiers seront téléchargés dans le répertoire c:apache-tomcat-5.5.29webappsdata.