Servlet 文件上传

收藏501

阅读16633

更新时间2022-04-14

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

创建一个文件上传表单

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

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

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

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

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

 

文件上传表单


文件上传:

请选择要上传的文件:

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

 文件上传: 
请选择要上传的文件: 
 
 
 
 
注:这只是虚拟的表单,不会正常工作。

编写后台 Servlet

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

 
....
 
    Location to store uploaded file 
    file-upload 
    
         c:\apache-tomcat-5.5.29\webapps\data\
      

....

以下是 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.29\webapps\data。

// 导入必需的 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("");
         out.println("");
         out.println("Servlet upload");  
         out.println("");
         out.println("");
         out.println("

No file uploaded

");           out.println("");          out.println("");          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("");       out.println("");       out.println("Servlet upload");         out.println("");       out.println("");       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 + "
");          }       }       out.println("");       out.println("");    }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 文件中创建所需的条目,如下所示:

 
   UploadServlet
   UploadServlet



   UploadServlet
   /UploadServlet

现在尝试使用您在上面创建的 HTML 表单来上传文件。当您在浏览器中访问:http://localhost:8080/UploadFile.htm 时,它会显示下面的结果,这将有助于您从本地计算机上传任何文件。

 文件上传: 
请选择要上传的文件: 
 
 

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

科技资讯

更多

精选课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

61.8万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

39.4万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

71万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

61.7万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

23万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

34万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

125.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号