FileUpload组件学习
文件上传时表单提交方式为post,entype值为multipart/form-data二进制上传。
使用formData上传文件时:
processData:false,/*设置不处理数据*/
contentType:false
原理
//对request.getInputStream();获取表单数据的封装
使用步骤
- 解析请求: 目标:确保该请求为文件上传请求,否则需要返回前端页面重新请求
ServletFileUpload.isMultipartContent(request);
-
创建基于磁盘管理的文件工厂, 目标:管理、接收上传的文件
原则:阿帕奇官方在文档中说明了一些必须遵守的原则:
- 上传的小文件可以保存在内存中。
- 较大的项目应写入磁盘上的临时文件。
- 不允许非常大的上传请求。
- 要设置3个参数(重要)项目最大大小、上传请求最大允许大小以及临时文件的位置
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置缓冲区大小与临时文件目录
factory.setSizeThreshold(1024*1024*10);
File uploadTemp=new File("D:\\uploadTemp");
uploadTemp.mkdirs();
factory.setRepository(uploadTemp);
-
创建文件上传的管理者,目标:通过该实例解析请求,获得每一个表单项
//创建文件上传管理者 ServletFileUpload upload=new ServletFileUpload(diskFileItemFactory); //设置最大请求限制以及最大文件上传值 upload.setSizeMax(1024*1024*10); upload.setFileSizeMax(1024*1024*30); //解析请求,list存放着所有的表单请求项 List<FileItem> items =upload.parseRequest(request);
-
处理表单项,目标:获得所有表单项,这里区别普通项以及图片项,具体做法如下:
for(FileItem item:items){ //判断是不是普通项,是则正常处理 if(item.isFormField()){//判断是否是上传组件 String name=item.getFieldName(); String value=item.getString();//获取非上传组件的value }else{ //图片,进行文件上传 String filedName=item.getFieldName();//获取表单的name属性值 String file=item.getName();//获取上传组件的名称 String contentType=item.getContentType();//获取上传文件的MIME类型 item.write(new File("src/"+ UUID.randomUUID() +".png"));//将上传项写入指定文件 //InputStream inputStream = item.getInputStream();//获取输入流读取文件 item.delete();//上传完成后删除临时文件 } }
-
清理资源
在web.xml中配置
<listener> <listener-class>org.apache.commons.fileupload.servlet.FileCleanerCleanup</listener-class> </listener>