一.概述
本类是用于处理文件上传的高级API。
1.
RFC 1867
2.multipart/mixed编码类型的html widget
二.类继承关系
三.类方法
四.ServletFileUpload源码
// 1.2.1
package org.apache.commons.fileupload.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
/**
* <p>用于处理文件上传的高级API</p>
*
* 本类处理由html widget发送的multipart/mixed编码类型、RFC 1867(http://www.ietf.org/rfc/rfc1867.txt)指定的多个文件
* 使用parseRequest(HttpServletRequest)方法获取与给定的html widget相关联的org.apache.commons.fileupload.FileItem列表
*
* 上传文件是保存在内存,缓存到本地,还是其他地方,由DiskFileItemFactory决定
*/
public class ServletFileUpload extends FileUpload {
/**
* 构造此类的未初始化实例
* 在尝试解析请求之前,必须调用setFileItemFactory(FileItemFactory factory)方法配置FileItemFactory
*/
public ServletFileUpload() {
super();
}
/**
* 构造本类的一个实例
* 本类用提供的factory去创建FileItem实例
* @param fileItemFactory The factory to use for creating file items.
*/
public ServletFileUpload(FileItemFactory fileItemFactory) {
super(fileItemFactory);
}
/**
* 确定请求是否包含多部分内容。可用来判断是否是文件上传请求
*
* @param request servlet请求对象,必须非空
* @return true:文件上传请求
*/
public static final boolean isMultipartContent(HttpServletRequest request) {
// 文件上传一定是post请求
if (!"post".equals(request.getMethod().toLowerCase())) {
return false;
}
String contentType = request.getContentType();
if (contentType == null) {
return false;
}
// 文件上传内容类型一定以multipart/开头
if (contentType.toLowerCase().startsWith(MULTIPART)) {
return true;
}
return false;
}
/**
* 解析上传文件的multipart/form-data流,返回按照传输顺序解析出的FileItem实例列表
* http://www.ietf.org/rfc/rfc1867.txt RFC 1867
*
* @param request 被解析的servlet请求
* @return 按照传输顺序,从请求中解析出的FileItem实例列表
* @throws FileUploadException 如果读/解析请求或存储文件有问题。
*/
public List /* FileItem */ parseRequest(HttpServletRequest request) throws FileUploadException {
return parseRequest(new ServletRequestContext(request));
}
/**
* 解析上传文件的multipart/form-data流,返回按照传输顺序解析出的FileItemStream实例迭代器
*
* @param request 被解析的servlet请求
* @return 按照传输顺序,从请求中解析出的FileItemStream实例迭代器
* @throws FileUploadException 如果读/解析请求或存储文件有问题
* @throws IOException 发生I/O错误。 这可能是与客户端通信时的网络错误或存储上传的内容时出现的问题
*/
public FileItemIterator getItemIterator(HttpServletRequest request) throws FileUploadException, IOException {
return super.getItemIterator(new ServletRequestContext(request));
}
}
五.FileUpload源码
package org.apache.commons.fileupload;
public class FileUpload extends FileUploadBase {
// 用于创建FileItem的工厂
private FileItemFactory fileItemFactory;
/**
* 构造此类的未初始化实例
* 一个FileItemFactory必须被配置,在解析请求之前用过调用setFileItemFactory方法配置
*/
public FileUpload() {
super();
}
/**
* 使用给定的fileItemFactory构造此类的实例
*/
public FileUpload(FileItemFactory fileItemFactory) {
super();
this.fileItemFactory = fileItemFactory;
}
/**
* Returns the factory class used when creating file items.
*/
public FileItemFactory getFileItemFactory() {
return fileItemFactory;
}
/**
* Sets the factory class to use when creating file items.
*
* @param factory The factory class for new file items.
*/
public void setFileItemFactory(FileItemFactory factory) {
this.fileItemFactory = factory;
}
}
六.ServletFileUpload实例
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
factory.setSizeThreshold(MaxMemorySize);
factory.setRepository(TempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Set overall request size constraint
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List<FileItem> items = upload.parseRequest(request);