1.ServletFileUpload类源码
public class ServletFileUpload extends FileUpload {
/**
* Constant for HTTP POST method.
*/
private static final String POST_METHOD = "POST";
/**
*确定请求是否包含多部分内容。可用来判断是否是文件上传请求
*/
public static final boolean isMultipartContent(
HttpServletRequest request) {
if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) {
return false;
}
return FileUploadBase.isMultipartContent(new ServletRequestContext(request));
}
/**
*构造器
*/
public ServletFileUpload() {
super();
}
public ServletFileUpload(FileItemFactory fileItemFactory) {
super(fileItemFactory);
}
/**
* 解析上传文件的multipart/form-data流,返回按照传输顺序解析出的FileItem实例列表
*/
@Override
public List<FileItem> parseRequest(HttpServletRequest request)
throws FileUploadException {
return parseRequest(new ServletRequestContext(request));
}
/**
* Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
* compliant <code>multipart/form-data</code> stream.
* @since 1.3
*/
public Map<String, List<FileItem>> parseParameterMap(HttpServletRequest request)
throws FileUploadException {
return parseParameterMap(new ServletRequestContext(request));
}
/**
* 解析上传文件的multipart/form-data流,返回按照传输顺序解析出的FileItemStream实例迭代器
*/
public FileItemIterator getItemIterator(HttpServletRequest request)
throws FileUploadException, IOException {
return super.getItemIterator(new ServletRequestContext(request));
}
}
2.FileUpload类源码
public class FileUpload extends FileUploadBase {
/**
* The factory to use to create new form items.
*/
private FileItemFactory fileItemFactory;
public FileUpload() {
super();
}
public FileUpload(FileItemFactory fileItemFactory) {
super();
this.fileItemFactory = fileItemFactory;
}
@Override
public FileItemFactory getFileItemFactory() {
return fileItemFactory;
}
@Override
public void setFileItemFactory(FileItemFactory factory) {
this.fileItemFactory = factory;
}
}
3.FileItemFactory接口源码
public interface FileItemFactory {
FileItem createItem(
String fieldName,
String contentType,
boolean isFormField,
String fileName
);
}
4.DiskFileItemFactory类源码
public class DiskFileItemFactory implements FileItemFactory {
/**
* 将文件保存在内存还是磁盘临时文件夹的默认临界值,值为10240,即10kb。
*/
public static final int DEFAULT_SIZE_THRESHOLD = 10240;
/**
* 用于配置在创建文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径
*/
private File repository;
/**
* 用于保存将文件保存在内存还是磁盘临时文件夹的临界值
*/
private int sizeThreshold = DEFAULT_SIZE_THRESHOLD;
/**
*用于追踪产生的临时文件。如果不想追踪临时文件,设置
*FileCleaningTracker 为null。
*/
private FileCleaningTracker fileCleaningTracker;
public DiskFileItemFactory() {
this(DEFAULT_SIZE_THRESHOLD, null);
}
public DiskFileItemFactory(int sizeThreshold, File repository) {
this.sizeThreshold = sizeThreshold;
this.repository = repository;
}
public File getRepository() { return repository; }
public void setRepository(File repository) { this.repository = repository; }
public int getSizeThreshold() { return sizeThreshold; }
public void setSizeThreshold(int sizeThreshold) { this.sizeThreshold = sizeThreshold; }
public FileCleaningTracker getFileCleaningTracker() { return fileCleaningTracker; }
public void setFileCleaningTracker(FileCleaningTracker pTracker) { fileCleaningTracker = pTracker;}
public FileItem createItem(String fieldName, String contentType,
boolean isFormField, String fileName) {
DiskFileItem result = new DiskFileItem(fieldName, contentType,
isFormField, fileName, sizeThreshold, repository);
FileCleaningTracker tracker = getFileCleaningTracker();
if (tracker != null) {
tracker.track(result.getTempFile(), result);
}
return result;
}
}
5.FileItem类
public interface FileItem extends Serializable, FileItemHeadersSupport {
//以流的形式返回上传文件的数据内容。
InputStream getInputStream() throws IOException;
//getContentType 方法用于获得上传文件的类型,即表单字段元素描述头属性“Content-Type”的值,如“image/jpeg”。
//如果FileItem类对象对应的是普通表单字段,该方法将返回null。
String getContentType();
// getName方法用于获得文件上传字段中的文件名。
String getName();
//isInMemory方法用来判断FileItem对象封装的数据内容是存储在内存中,还是存储在临时文件中,
//如果存储在内存中则返回true,否则返回false。
boolean isInMemory();
//返回该上传文件的大小(以字节为单位)
long getSize();
byte[] get();
//getString方法用于将FileItem对象中保存的数据流内容以一个字符串返回,它有两个重载的定义形式:
//前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集编码将主体内容转换成字符串
//如果在读取普通表单字段元素的内容时出现了中文乱码现象,请调用第二个getString方法,并为之传递正确的字符集编码名称
String getString(String encoding) throws UnsupportedEncodingException;
String getString();
//它主要用途是将上传的文件内容保存在本地文件系统中
void write(File file) throws Exception;
//delete方法用来清空FileItem类对象中存放的主体内容,如果主体内容被保存在临时文件中,delete方法将删除该临时文件。
//尽管当FileItem对象被垃圾收集器收集时会自动清除临时文件,但及时调用delete方法可以更早的清除临时文件,
//释放系统存储资源。另外,当系统出现异常时,仍有可能造成有的临时文件被永久保存在了硬盘中。
void delete();
//getFieldName方法用于返回表单标签name属性的值。如上例中<input type="text" name="column" />的value
String getFieldName();
void setFieldName(String name);
//isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,
//如果是普通表单字段则返回true,否则返回false。因此,可以使用该方法判断是否为普通表单域,
//还是文件上传表单域
boolean isFormField();
void setFormField(boolean state);
OutputStream getOutputStream() throws IOException;
}
6.简单的使用流程
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(MaxMemorySize);
factory.setRepository(TempDirectory);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(yourMaxRequestSize);
List<FileItem> items = upload.parseRequest(request);