Servlet - 文件上传

  • 简述

    Servlet 可以与 HTML 表单标签一起使用,以允许用户将文件上传到服务器。上传的文件可以是文本文件或图像文件或任何文档。
  • 创建文件上传表单

    以下 HTM 代码创建了一个上传者表单。以下是要记下的要点 -
    • 表格 method 属性应该设置为 POST 方法和GET方法不能使用
    • 表格 enctype 属性应该设置为 multipart/form-data.
    • 表格 action属性应设置为 servlet 文件,该文件将处理后端服务器上的文件上传。以下示例正在使用UploadServlet servlet 上传文件。
    • 要上传单个文件,您应该使用一个带有属性 type="file" 的 <input .../> 标签。要允许上传多个文件,请为 name 属性包含多个具有不同值的输入标签。浏览器将浏览按钮与每个按钮相关联。
     
    <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>
    
    这将显示以下结果,允许从本地 PC 中选择文件,当用户单击“上传文件”时,表单将与所选文件一起提交 -
     
    File Upload: 
    Select a file to upload: 
  • 编写后端 Servlet

    以下是servlet UploadServlet这将负责接受上传的文件并将其存储在目录 <Tomcat-installation-directory>/webapps/data 中。也可以使用外部配置添加此目录名称,例如context-param web.xml 中的元素如下 -
     
    <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>
    
    下面是 UploadServlet 的源代码,它可以一次处理多个文件上传。在继续之前,请确保以下事项 -
    • 以下示例取决于 FileUpload,因此请确保您拥有最新版本的 commons-fileupload.x.x.jar类路径中的文件。您可以从https://commons.apache.org/fileupload/下载它。
    • FileUpload 依赖于 Commons IO,因此请确保您拥有最新版本的 commons-io-x.x.jar类路径中的文件。您可以从https://commons.apache.org/io/下载它。
    • 在测试以下示例时,您应该上传一个小于maxFileSize的文件,否则文件将不会被上传。
    • 确保您已经提前创建了目录 c:\temp 和 c:\apache-tomcat8.0.28\webapps\data。
    
    // 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.");
          }
       }
    }
    
  • 编译和运行 Servlet

    编译上面的 servlet UploadServlet 并在 web.xml 文件中创建所需的条目,如下所示。
     
    <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>
    
    现在尝试使用您在上面创建的 HTML 表单上传文件。当您尝试 http://localhost:8080/UploadFile.htm 时,它会显示以下结果,这将帮助您从本地计算机上传任何文件。
    File Upload:
    Select a file to upload:
    如果您的 servlet 脚本工作正常,您的文件应该上传到 c:\apache-tomcat8.0.28\webapps\data\ 目录中。