Java使用Commons-FileUpload组件实现文件上传最佳方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java使⽤Commons-FileUpload组件实现⽂件上传最佳⽅案
学习的⽬标
使⽤commons-fileupload实现⽂件上传
使⽤commons-fileupload封装⽂件上传⼯具类
什么是commons-fileupload?
The CommonsFileUploadpackage makes it easy to add robust, high-performance, file upload capability to your servlets and web applications.
FileUpload parses HTTP requests which conform toRFC 1867, "Form-based File Upload in HTML". That is, if an HTTP request is submitted using the POST method, and with a content type of "multipart/form-data", then FileUpload can parse that request, and make the results available in a manner easily used by the caller.
FileUpload包可以很容易地添加强⼤的,⾼性能,⽂件上传到你的Servlet的Web应⽤程序的能⼒。
FileUpload解析HTTP请求符合RFC 1867年,“在HTML的⽂件上传。
就是说,如果⼀个HTTP请求是使⽤POST⽅法提交,并与⼀个内容类型“multipart/form-data”,然后FileUpload可以解析这个请求,并把结果提供⼀个容易使⽤的调⽤⽅式。
为什么要使⽤commons-fileupload
在使⽤传统的Servlet上传的时候我们可以使⽤req.getInputStream()来获取⽂件上传的流,我们在获取到这个流之后需要⼿动的针对这个流进⾏特殊处理进⾏去流中不必要的开始和结束内容,才能真正的获取到流的内容,本章节并不对原始Servlet的上传进⾏探究,我们另开章节针对原始Servelt上传进⾏探究。
使⽤commons-fileupload的要求
1. method⽅法必须是POST,不能是GET
2. 新加⼀个属性enctype,值为”multipart/form-data”
3. ⽂件表单项<input>的类型为file,即type=”file”
commons-fileupload的Maven依赖
<!-- https:///artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https:///artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
使⽤commons-fileupload核⼼步骤解读
第⼀步:判断是否可以进⾏⽂件上传
第⼆步:创建⼀个FileItem⼯⼚,通过⼯⼚创建⽂件上传核⼼组件ServletFileUpload对象
第三步:通过核⼼上传组件解析request请求,获取表单的所有表单项,表单的每⼀个表单项对应⼀个FileItem
第四步:遍历所有的表单项,判断是否是普通的表单项,如果不是就是⽂件上传,就可以针对遍历的这个fileItem进⾏⼀系列的操作
封装⼀个⼯具类,让我们在处理⽂件上传的时候爽呀爽
在上⾯我们已经介绍过了使⽤commons-fileupload上传⽂件的整个流程,所以我们就直接将这个流程封装成⼀个⼯具类,在使⽤到⽂件上传的Servlet中直接使⽤,⼗分便利
第⼀步:创建⼀个DTO(⽤于存储commons-fileupload解析请求的结果)
import mons.fileupload.FileItem;
import java.util.HashMap;
import java.util.Map;
public class ParamDto {
private Map<String,String> paramMap;
private Map<String,FileItem> fileMap;
public ParamDto() {
paramMap = new HashMap<>();
fileMap = new HashMap<>();
}
public Map<String, String> getParamMap() {
return paramMap;
public void setParamMap(Map<String, String> paramMap) {
this.paramMap = paramMap;
}
public Map<String, FileItem> getFileMap() {
return fileMap;
}
public void setFileMap(Map<String, FileItem> fileMap) {
this.fileMap = fileMap;
}
}
第⼆步:将commons-fileupload解析⽂件的整个请求,封装成⼀个⼯具类import mons.fileupload.FileItem;
import mons.fileupload.FileUploadException;
import mons.fileupload.disk.DiskFileItemFactory;
import mons.fileupload.servlet.ServletFileUpload;
import org.imooc.dto.ParamDto;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
public class RequestUtil {
/**
* 从request流中解析参数与上传的⽂件
* @param request
*/
public static ParamDto parseParam(HttpServletRequest request) {
ParamDto result = new ParamDto();
//创建⼀个FileItem⼯⼚通过DiskFileItemFactory对象创建⽂件上传核⼼组件
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
upload.setHeaderEncoding("UTF-8");
try {
//通过⽂件上传核⼼组件解析request请求,获取到所有的FileItem对象
List<FileItem> fileItemList = upload.parseRequest(request);
//遍历表单的所有表单项(FileItem)并对其进⾏相关操作
for(FileItem fileItem : fileItemList) {
//判断这个表单项如果是⼀个普通的表单项
if(fileItem.isFormField()) {
result.getParamMap().put(fileItem.getFieldName(),fileItem.getString("UTF-8")); //如果不是表单的普通⽂本域,就是
} else {
result.getFileMap().put(fileItem.getFieldName(),fileItem);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
第三步:让我们直接在Servlet中使⽤这个⼯具类吧,哈哈
另:我们当然可以封装⼀个保存⽂件(Item)的⼀个通⽤⽅法
import mons.fileupload.FileItem;
import java.io.File;
public class FileUtil {
/**
* 上传⽂件的保存路径
*/
public static final String SAVE_PATH = "d:/upload/";
* 保存上传的⽂件
* @param fileItem
* @param path
* @return
* @throws Exception
*/
public static String save(FileItem fileItem,String path) throws Exception { String fileName = System.currentTimeMillis() + "_" + fileItem.getName(); fileItem.write(new File(path + fileName));
return fileName;
}
}
好啦~ 有空我们再来看看原始的⽂件上传⽅式。