org.apache.commons.fileupload.servlet.ServletFileUpload类是Apache文件上传组件处理文件上传的核心高级类(所谓高级就是不须要管底层实现,暴露给用户的简单易用的接口)。java
使用其parseRequest(HttpServletRequest) 方法能够将经过表单中每个HTML标签提交的数据封装成一个FileItem对象,而后以List列表的形式返回。使用该方法处理上传文件简单易用。apache
在使用ServletFileUpload对象解析请求时须要根据DiskFileItemFactory对象的属性sizeThreshold(临界值)和repository(临时目录)来决定将解析获得的数据保存在内存仍是临时文件中,若是是临时文件,保存在哪一个临时目录中?。因此,咱们须要在进行解析工做前构造好DiskFileItemFactory对象,经过ServletFileUpload对象的构造方法或setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性。数组
ServletFileUpload继承结构:
java.lang.Object服务器
|—org.apache.commons.fileupload.FileUploadBase性能
|—org.apache.commons.fileupload.FileUpload编码
|—org.apache.commons.fileupload.servlet.ServletFileUploadspa
构造方法:
1) public ServletFileUpload()orm
构造一个未初始化的实例,须要在解析请求以前先调用setFileItemFactory()方法设置 fileItemFactory属性。对象
2) public ServletFileUpload(FileItemFactory fileItemFactory)继承
构造一个实例,并根据参数指定的FileItemFactory 对象,设置 fileItemFactory属性。
ServletFileUpload类经常使用方法:
1) public void setSizeMax(long sizeMax)
setSizeMax方法继承自FileUploadBase类,用于设置请求消息实体内容(即全部上传数据)的最大尺寸限制,以防止客户端恶意上传超大文件来浪费服务器端的存储空间。其参数是以字节为单位的long型数字。
在请求解析的过程当中,若是请求消息体内容的大小超过了setSizeMax方法的设置值,将会抛出FileUploadBase内部定义的SizeLimitExceededException异常(FileUploadException的子类)。该方法有一个对应的读方法:public long getSizeMax()方法。
2) public void setFileSizeMax(long fileSizeMax)
setFileSizeMax方法继承自FileUploadBase类,用于设置单个上传文件的最大尺寸限制,以防止客户端恶意上传超大文件来浪费服务器端的存储空间。其参数是以字节为单位的long型数字。该方法有一个对应的读方法:public long geFileSizeMax()方法。
在请求解析的过程当中,若是单个上传文件的大小超过了setFileSizeMax方法的设置值,将会抛出FileUploadBase内部定义的FileSizeLimitExceededException异常(FileUploadException的子类)。
3) public List parseRequest(javax.servlet.http.HttpServletRequest req)
parseRequest 方法是ServletFileUpload类的重要方法,它是对HTTP请求消息体内容进行解析的入口方法。它解析出FORM表单中的每一个字段的数据,并将它们分别包装成独立的FileItem对象,而后将这些FileItem对象加入进一个List类型的集合对象中返回。
该方法抛出FileUploadException异常来处理诸如文件尺寸过大、请求消息中的实体内容的类型不是“multipart/form-data”、IO异常、请求消息体长度信息丢失等各类异常。每一种异常都是FileUploadException的一个子类型。
4) public FileItemIterator getItemIterator(HttpServletRequest request)
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"));