官方网站:[http://jakarta.apache.org/commons/fileupload/ ]
它提供基于Servlet的上传,可上传到内存、文件,且文件的上传位置,最大上传文件字节数可以在程序中设置,
特别是对于多文件上传支持较好,List items = upload.parseRequest(request)就可以处理多文件,其他都不用考虑,
提供了item.isFormField()判断是否为标准表单值的方法,简洁实用,但是可配置仍然不好,对API的依赖性很大
使用步骤:
1、首先判断一个HttpServletRequest是否是一个上传文件的请求:
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
2、处理请求:
2.1、创建基于硬盘存储的工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
/* 或者
DiskFileItemFactory factory = new DiskFileItemFactory(yourMaxMemorySize, yourTempDirectory);
*/
2.2、设置工厂属性,从而生成个性化ServletFileUpload
//设置最多只允许在内存中存储的数据,单位:字节
factory.setSizeThreshold(yourMaxMemorySize);
// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
factory.setRepository(yourTempDirectory);
2、处理上传文件:
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
//判断是否为标准表单域
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
…
} else {
String fieldname = item.getFieldName();
String filename = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
…
//直接从内存访问上传数据
byte[] data = item.get();
//采用流方式读取上传文件
InputStream stream = item.openStream();
// 保存到文件
if (writeToFile) {
File uploadedFile = new File(storeFilePath);
item.write(uploadedFile);
} else {
//转换为输出流
InputStream uploadedStream = item.getInputStream();
...
uploadedStream.close();
}
}
...