commons-fileupload的ServletFileUpload类

ServletFileUpload类

1、前言

在看本篇文章之前请你确保自己已经知道DiskFileItemFactory类的属性,作用以及其内部的一些常用方法。因为本篇的ServletFileUpload需要用到上篇的DiskFileItemFactory类。所以,在此之前你最好看一下commons fileupload的DiskFileItemFactory

2、ServletFileUpload和DiskFileItemFactory之间的关系

在使用ServletFileUpload对象解析请求时,需要根据DiskFileItemFactory对象的属性sizeThreshold(临界 值)和repository(临时目录)来决定将解析得到的数据保存在内存还是临时文件中,如果是临时文件,保存在哪个临时目录中?所以,我们需要在进 行解析工作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方法或 setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性。

3、ServletFileUpload的属性

/**代表http请求是post请求的一个属性*/
 private static final String POST_METHOD = "POST";

另外需要说明:ServletFileUpload是FileUpload接口的实现类,而FileUpload接口有一个属性:

 private FileItemFactory fileItemFactory

fileItemFactory很容易想到是DiskFileItemFactory的接口。所以我们可以说ServletFileUpload间接拥有一个DiskFileItemFactory属性(这样说不太符合java语言,这里只是为了理解)。这算是为了讲ServletFileUpload的构造器时的铺垫

3、ServletFileUpload的构造器

/**
ServletFileUpload类的空构造,如果你是用改构造器创建了一个ServletFileUpload的实例,
则你在使用该实例解析请求之前,需要先调用setFileItemFactory()方法设置 fileItemFactory属性。
*/
public ServletFileUpload(){
}
/**
带参构造。在创建ServletFileUpload实例的时候直接给fileItemFactory属性赋值,然后直接利用该实例进行解析上传请求。
*/
public ServletFileUpload(FileItemFactory fileItemFactory){
        super(fileItemFactory);
    }

4、ServletFileUpload的常用方法

1) public void setSizeMax(long sizeMax)

1.setSizeMax方法继承自FileUploadBase类,用于设置本次请求消息实体内容(即所有上传数据)的最大尺寸限制,以防止客户端恶意上传超大文件来浪费服务器端的存储空间。其参数是以字节为单位的long型数字。
2. 在请求解析的过程中,如果请求消息体内容的大小超过了setSizeMax方法的设置值,将会抛出FileUploadBase内部定义的SizeLimitExceededException异常(FileUploadException的子类)。该方法有一个对应的读方法:public long getSizeMax()方法.

2) public void setFileSizeMax(long fileSizeMax)
1.setFileSizeMax方法继承自FileUploadBase类,用于设置单个上传文件的最大尺寸限制,以防止客户端恶意上传超大文件来浪费服务器端的存储空间。其参数是以字节为单位的long型数字。该方法有一个对应的读方法:public long geFileSizeMax()方法。
2.在请求解析的过程中,如果单个上传文件的大小超过了setFileSizeMax方法的设置值,将会抛出FileUploadBase内部定义的 FileSizeLimitExceededException异常(FileUploadException的子类)。

3) public List parseRequest(javax.servlet.http.HttpServletRequest req)
1. parseRequest 方法是ServletFileUpload类的重要方法,它是对HTTP请求消息体内容进行解析的入口方法。它解析出FORM表单中的每个字段的数据,并 将它们分别包装成独立的FileItem对象,然后将这些FileItem对象加入进一个List类型的集合对象中返回。
2.该方法抛出FileUploadException异常来处理诸如文件尺寸过大、请求消息中的实体内容的类型不是“multipart/form- data”、IO异常、请求消息体长度信息丢失等各种异常。每一种异常都是FileUploadException的一个子类型。

4) public FileItemIterator getItemIterator(HttpServletRequest request)
1.getItemIterator方法和parseRequest 方法基本相同。但是getItemIterator方法返回的是一个迭代器,该迭代器中保存的不是FileItem对象,而是 FileItemStream 对象,如果你希望进一步提高新能,你可以采用getItemIterator方法,直接获得每一个文件项的数据输入流,做底层处理;如果性能不是问题,你 希望代码简单,则采用parseRequest方法即可。

5) public stiatc boolean isMultipartContent(HttpServletRequest req)
isMultipartContent方法方法用于判断请求消息中的内容是否是“multipart/form-data”类型,是则返回true,否则 返回false。isMultipartContent方法是一个静态方法,不用创建ServletFileUpload类的实例对象即可被调用。

6) getFileItemFactory()和setFileItemFactory(FileItemFactory)

方法继承自FileUpload类,用于设置和读取fileItemFactory属性。

7) public void setProgressListener(ProgressListener pListener)
设置文件上传进度监听器。该方法有一个对应的读取方法:ProgressListener getProgressListener()。

8) public void setHeaderEncoding()
在文件上传请求的消息体中,除了普通表单域的值是文本内容以外,文件上传字段中的文件路径名也是文本,在内存中保存的是它们的某种字符集编码的字节数 组,Apache文件上传组件在读取这些内容时,必须知道它们所采用的字符集编码,才能将它们转换成正确的字符文本返回。
setHeaderEncoding方法继承自FileUploadBase类,用于设置上面提到的字符编码。如果没有设置,则对应的读方法 getHeaderEncoding()方法返回null,将采用HttpServletRequest设置的字符编码,如果 HttpServletRequest的字符编码也为null,则采用系统默认字符编码。可以通过一下语句获得系统默认字符编码:

     System.getProperty("file.encoding"));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值