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

本文详细介绍了文件上传的基本原理,包括post请求、enctype属性、表单中使用<input type=file>元素等,并讨论了如何使用Apache的Commons-fileupload组件简化文件上传过程。此外,还提供了文件上传的核心API介绍、常见问题解决方法和一个简单的案例演示。

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工作流程

   163058_VKGY_1427560.gif

      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 文件上传的简单案例

     164553_3mRD_1427560.png

     164734_AEQL_1427560.png

   164842_4d7K_1427560.png

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

164927_EBja_1427560.png

165009_boGC_1427560.png

165046_dqE0_1427560.png

165116_tkle_1427560.png

4.文件下载

165153_IVfo_1427560.png

5.Servlet规范中的监听器

165314_Uzot_1427560.png

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

转载于:https://my.oschina.net/codeWatching/blog/398182

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值