搜索
  • 登录
  • 注册
密码重置成功

关注您感兴趣的项目并了解有关它们的最新消息

Servlet 文件上传

收藏 14
阅读 16245
更新时间 2016-09-11

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

创建一个文件上传表单

下面的 HTML 代码创建了一个文件上传表单。以下几点需要注意:

  • 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法。

  • 表单 enctype 属性应该设置为 multipart/form-data.

  • 表单 action 属性应该设置为在后端服务器上处理文件上传的 Servlet 文件。下面的实例使用了 UploadServlet Servlet 来上传文件。

  • 上传单个文件,您应该使用单个带有属性 type="file" 的 <input .../> 标签。为了允许多个文件上传,请包含多个 name 属性值不同的 input 标签。输入标签具有不同的名称属性的值。浏览器会为每个 input 标签关联一个浏览按钮。

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

这将显示下面的结果,允许用户从本地计算机选择一个文件,当用户点击"上传文件"时,表单会连同从本地计算机选择的文件一起提交:

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

编写后台 Servlet

以下是 Servlet UploadServlet,会接受上传的文件,并把它储存在目录 <Tomcat-installation-directory>/webapps/data 中。这个目录名也可以使用外部配置来添加,比如 web.xml 中的 context-param 元素,如下所示:

 <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,所以一定要确保在您的 classpath 中有最新版本的 commons-fileupload.x.x.jar 文件。可以从 http://commons.apache.org/fileupload/ 下载。

  • FileUpload 依赖于 Commons IO,所以一定要确保在您的 classpath 中有最新版本的 commons-io-x.x.jar 文件。可以从 http://commons.apache.org/io/ 下载。

  • 在测试下面实例时,您上传的文件大小不能大于 maxFileSize,否则文件将无法上传。

  • 请确保已经提前创建好目录 c:temp and c:apache-tomcat-5.5.29webappsdata。

// 导入必需的 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.");
   } 
}

编译和运行 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 时,它会显示下面的结果,这将有助于您从本地计算机上传任何文件。

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

如果您的 Servelt 脚本能正常工作,那么您的文件会被上传到 c:apache-tomcat-5.5.29webappsdata 目录中。

热AI工具
Undress AI Tool
Undress AI Tool

免费脱衣服图片

AI Clothes Remover
AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undresser.AI Undress
Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

Stock Market GPT
Stock Market GPT

人工智能驱动投资研究,做出更明智的决策

热门工具
记事本++7.3.1
记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版
SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1
禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6
Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版
SublimeText3 Mac版

神级代码编辑软件(SublimeText3)