java fileupload规则_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的要求

method方法必须是POST,不能是GET

新加一个属性enctype,值为”multipart/form-data”

文件表单项的类型为file,即type=”file”

commons-fileupload的Maven依赖

commons-fileupload

commons-fileupload

1.3.1

commons-io

commons-io

2.4

使用commons-fileupload核心步骤解读

第一步:判断是否可以进行文件上传

7a6069c0ed4a6d0fe0d947129ee80264.png

9419269.html

第二步:创建一个FileItem工厂,通过工厂创建文件上传核心组件ServletFileUpload对象

58c72bfe924bb228f4655be18c8b8358.png

9419269.html

第三步:通过核心上传组件解析request请求,获取表单的所有表单项,表单的每一个表单项对应一个FileItem

2c70a6e814c3efe2950815ad2a7b317e.png

9419269.html

第四步:遍历所有的表单项,判断是否是普通的表单项,如果不是就是文件上传,就可以针对遍历的这个fileItem进行一系列的操作

f921df3e39303528899eb8caac27fce5.png

9419269.html

封装一个工具类,让我们在处理文件上传的时候爽呀爽

在上面我们已经介绍过了使用commons-fileupload上传文件的整个流程,所以我们就直接将这个流程封装成一个工具类,在使用到文件上传的Servlet中直接使用,十分便利

第一步:创建一个DTO(用于存储commons-fileupload解析请求的结果)

importorg.apache.commons.fileupload.FileItem;importjava.util.HashMap;importjava.util.Map;public classParamDto {private MapparamMap;private MapfileMap;publicParamDto() {

paramMap= new HashMap<>();

fileMap= new HashMap<>();

}public MapgetParamMap() {returnparamMap;

}public void setParamMap(MapparamMap) {this.paramMap =paramMap;

}public MapgetFileMap() {returnfileMap;

}public void setFileMap(MapfileMap) {this.fileMap =fileMap;

}

}

第二步:将commons-fileupload解析文件的整个请求,封装成一个工具类

importorg.apache.commons.fileupload.FileItem;importorg.apache.commons.fileupload.FileUploadException;importorg.apache.commons.fileupload.disk.DiskFileItemFactory;importorg.apache.commons.fileupload.servlet.ServletFileUpload;importorg.imooc.dto.ParamDto;importjavax.servlet.http.HttpServletRequest;importjava.io.File;importjava.util.List;public classRequestUtil {/*** 从request流中解析参数与上传的文件

*@paramrequest*/

public staticParamDto parseParam(HttpServletRequest request) {

ParamDto result= newParamDto();//创建一个FileItem工厂 通过DiskFileItemFactory对象创建文件上传核心组件

ServletFileUpload upload = new ServletFileUpload(newDiskFileItemFactory());

upload.setHeaderEncoding("UTF-8");try{//通过文件上传核心组件解析request请求,获取到所有的FileItem对象

List 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();

}returnresult;

}

}

第三步:让我们直接在Servlet中使用这个工具类吧,哈哈

76dee24c62194090193b9d21ae52ad6b.png

9419269.html

另:我们当然可以封装一个保存文件(Item)的一个通用方法

importorg.apache.commons.fileupload.FileItem;importjava.io.File;public classFileUtil {/*** 上传文件的保存路径*/

public static final String SAVE_PATH = "d:/upload/";/*** 保存上传的文件

*@paramfileItem

*@parampath

*@return*@throwsException*/

public static String save(FileItem fileItem,String path) throwsException {

String fileName= System.currentTimeMillis() + "_" +fileItem.getName();

fileItem.write(new File(path +fileName));returnfileName;

}

}

好啦~ 有空我们再来看看原始的文件上传方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值