使用Commons-fileupload组件实现文件上传

来源:互联网 发布:淘宝申请售后 编辑:程序博客网 时间:2024/04/28 14:08
 

文件的上传

一  概念

1.实现web开发中的文件上传功能,需完成如下二个步骤:

(1)在web页面中添加上传输入项(jsp页面或html页面)

(2)在 servlet中读取上传文件的数据,并保存在本地硬盘中

2.如何在web页面中添加输入项

<input type=”file”>标签用于在web页面中添加文件上传输入项

(1)必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据

(2)必须把form的enctype属性值设置为multipart/form-data,设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。

3.如何在servlet中读取文件中上传的数据并保存到本地硬盘中

使用Commons-fileupload组件实现文件上传     

二   核心API

 1.DiskFileItemFactory   工厂类

DiskFileItemFactory 是创建 FileItem 对象的工厂,这个工厂类常用方法:

(1)public void setSizeThreshold(int sizeThreshold) :设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时,fileupload组件将使用临时文件缓存上传文件。

(2)public void setRepository(java.io.File repository) :指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").

(3)public DiskFileItemFactory(int 

sizeThreshold, java.io.File repository) :构造函数

2. ServletFileUpload  解析类

ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:

(1)boolean isMultipartContent(HttpServletRequest request) :判断上传表单是否为multipart/form-data类型

(2)List parseRequest(HttpServletRequest request):解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。

(3)setFileSizeMax(long fileSizeMax) :设置上传文件的最大值

(4)setSizeMax(long sizeMax) :设置上传文件总量的最大值

(5)setHeaderEncoding(java.lang.String encoding) :设置编码格式

(6)setProgressListener(ProgressListener pListener)

三  思路分析

1.文件上传的思路分析

     文件上传必定要用jsp中的form标签来显示页面,只要把input的类型设置为file就OK,再者就是在点击上传文件按钮的时候,要做处理,处理当然要交到servelt层去处理了,在servlet中获取消息头中的值,并判断是否是输入项,如果正确,跳转到成功页面,如果失败,跳转到失败页面。注意在上面介绍了在web页面中添加的输入项,必须修改form表单中的默认选项。

2.实现的具体思路

在servelt中用Apache中提供的组件实现上传

    Fileupload组件的工作流程

        把请求消息中每一个请求项都解析成对象item1  item2...

Fileltem[] item = ServeltFileupLoad   upload.parseRequest()

item1.isFormFiled()  

如果返回的是true,则说明是普通的输入项,可调用

                  Item1.getString() 来得到输入项的值  老王

                  Item1.getFieldName()  得到输入项的名字  user

              如果返回值是false,则说明是文件的上传项,可调用

                  Item1.getName()得到用户上传的文件的文件名

                  getInputStream()流对象得到内容

      

四  代码分析

1.upload.jsp页面 --- 用来给用户显示页面

<body>

<form action="${pageContext.request.contextPath}/servlet/uploadServlet"    method="post" enctype="multipart/form-data">

   上传用户:<input type="text" name="user"/><br/>

   上传文件:<input type="file" name="file1"/><br/>

   上传文件:<input type="file" name="file2"/><br/>

   <input type="submit" value="上传文件"/>    

   </form>

  </body>

2.UploadServlet2.java  ---  用来处理从upload.jsp中传的值

    public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

       try {

           // (1)创建一个解析器工厂

           DiskFileItemFactory factory = new DiskFileItemFactory();

           // (2)得到解析器

           ServletFileUpload upload = new ServletFileUpload(factory);

          

           //文件上传乱码

           upload.setHeaderEncoding("utf-8");

          

           // (3)对请求进行解析,有几个输入项,就有几个FileItem对象

           List<FileItem> list = upload.parseRequest(request);

           // (4)迭代list集合,获取list集合中的每一个输入项

           for (FileItem item : list) {

           // (1)判断输入的类型 item.isFormField()如果为真,为普通的输入项

               if (item.isFormField()) {

                  // 普通的输入项

                 String inputName = item.getFieldName();//输入项的名称

                 String inputValue = item.getString();//输入项的value值

                 System.out.println("输入项的名称:" + inputName + "  输入项的value值 "

                         + inputValue);

              } else {

                  // 上传文件的输入项

                  // 上传文件的文件名,得到的是完全的路径

                  String fileName = item.getName();                fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);// 得到上传的文件名

                  // 1.txt(不同的浏览器,得到的文件名不一样)

                  InputStream is = item.getInputStream();// 得到上传的输入流

                  // 输出到本地磁盘上

                  FileOutputStream fos = new FileOutputStream("c:\\"+ fileName);

 

                  byte[] buff = new byte[1024];

                  int len = 0;

                  while ((len = is.read(buff)) > 0) {

                     fos.write(buff, 0, len);

                  }

                  is.close();

                  fos.close();

              }

           }

           // 上传成功转向

           request.setAttribute("message", "上传成功");

       } catch (FileUploadException e) {

           e.printStackTrace();

           // 如果出现异常,转向

           request.setAttribute("message", "上传失败");

       }

       request.getRequestDispatcher("/message.jsp").forward(request, response);

    }

 3. message.jsp   成功或失败的跳转页面

     <body>
            <h2>${message}</h2>
    </body>

原创粉丝点击