2014-07-10 Java Web的学习(7)-----uploadFile&Listener

1.文件上传原理

     1.1使用上传的前提

       a、提交表单的method属性必须是post方式请求.

       b、提交表单的enctype属性必须是:multipart/form-data 

            enctype属性的默认值:application/x-www-form-urlencoded

             enctype属性和请求消息头"Content-Type" 是有同样的作用的.即告知服务器的请求正文的类型.

  application/x-www.form-urlencoded:

   请求正文:name=abc&password=123&gender=male

  multipart/form-data:

 请求正文:

-----------------------------7de15b135076c
Content-Disposition: form-data; name="username"

abc
-----------------------------7de15b135076c
Content-Disposition: form-data; name="file"; filename="charts.html"
Content-Type: text/html
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

-----------------------------7de15b135076c--

          c.表单中提供<input type="file"/> 类型文本输入域

     1.2 文件上传的小试牛刀

           request.getParameter("name").获取是请求正文是: application/x-www.form-urlencoded类型的正文;

      一般情况下,是以流的方式获取客户端提交的数据

      InputStream in = request.getInputStream().通过读取详解协议.

     1.3  解析器是对请求正文是multipart/form-data.

           目前是采用第三方框架的解析器解析正文

  • Request对象提供了一个getInputStream方法,通过这个方法可以读取到客户端提交过来的数据。但由于用户可能会同时上传多个文件,在servlet端编程直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作.

  • 为方便用户处理文件上传数据,Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现.

2.借助第三方组件实现文件上传

      2.1 组件名称

  • Commons-fileupload组件实现文件上传.小知识Apache组织下的拓展,关于Apache组织包命名规则.

  • 使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。

  • 版本问题:commons-fileupload-1.2.1.jar+commons-io-2.2.jar

             commons-fileupload-1.3.1.jar+commons-io-2.4.jar

      2.2 fileupload工作流程

   2014-07-10 Java Web的学习(7)-----uploadFile&Listener_第1张图片

      2.3 核心API(查询官网的文档)

DiskFileItemFactory

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

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

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

  • public DiskFileItemFactory(int sizeThreshold,java.io.File repository)构造函数

    ServletFileUpload

    • ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中.

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

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

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

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

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

    • setProgressListener(ProgressListener pListener) 注册过程监听器

         2.4 文件上传的简单案例

         2014-07-10 Java Web的学习(7)-----uploadFile&Listener_第2张图片

         2014-07-10 Java Web的学习(7)-----uploadFile&Listener_第3张图片

       2014-07-10 Java Web的学习(7)-----uploadFile&Listener_第4张图片

    3.文件上传时需要注意的问题

    2014-07-10 Java Web的学习(7)-----uploadFile&Listener_第5张图片

    2014-07-10 Java Web的学习(7)-----uploadFile&Listener_第6张图片

    2014-07-10 Java Web的学习(7)-----uploadFile&Listener_第7张图片

    4.文件下载

    5.Servlet规范中的监听器

    2014-07-10 Java Web的学习(7)-----uploadFile&Listener_第8张图片

    end...................................

    你可能感兴趣的:(2014-07-10 Java Web的学习(7)-----uploadFile&Listener)