Spring CommonsMultipartResolver上传文件小结
自从业至今,文件上传与IO流之类的调用,一直是理解比较模糊的地方,大多就这网上搜到的资料抄抄改改草草了事,内部原理一直不甚了解,今日我们通过Spring的CommonsMultipartResolver的工具类一探文件上传的秘密;
1.首先我们先看看CommonsMultipartResolver本身:

截图为CommonsMultipartResolver类的继承及接口实现关系:
a)我们首先看看感觉最没有关系的ServletContextAware,CommonsMultipartResolver实现了setServletContext方法,当没有指定临时的上传路径时,将上传的文件保存到ServletContext默认的位置;
@Override
public void setServletContext(ServletContext servletContext) {
if (!isUploadTempDirSpecified()) {
getFileItemFactory().setRepository(WebUtils.getTempDir(servletContext));
}
}
b)我们再来看看MultipartResolver接口:

CommonsMultipartResolver实现了截图中的三个方法,三个方法的源代码可以自己去查看,简单的说下方法的功能:
resolveMultipart将HttpServletRequest转化为MultipartHttpServletRequest,将里面的FileItem不是表单字段的对象转换为MultipartFile; @Override
public MultipartHttpServletRequest resolveMultipart(final HttpServletRequest request) throws MultipartException {
Assert.notNull(request, "Request must not be null");
if (this.resolveLazily) {
return new DefaultMultipartHttpServletRequest(request) {
@Override
protected void initializeMultipart() {
MultipartParsingResult parsingResult = parseRequest(request);
setMultipartFiles(parsingResult.getMultipartFiles());
setMultipartParameters(parsingResult.getMultipartParameters());
setMultipartParameterContentTypes(parsingResult.getMultipartParameterContentTypes());
}
};
}
else {
MultipartParsingResult parsingResult = parseRequest(request);
return new DefaultMultipartHttpServletRequest(request, parsingResult.getMultipartFiles(),
parsingResult.getMultipartParameters(), parsingResult.getMultipartParameterContentTypes());
}
}
isMultipart(HttpServletRequest request)判断HttpServletRequest请求方式是否为post方式,content-type中是否以multipart/开头;
cleanupMultipart(MultipartHttpServletRequest request)将请求中的FileItem删除;
c)最后来看看抽象类CommonsFileUploadSupport,我们比较常用的是MultipartParsingResult parseRequest(HttpServletRequest request)这个方法。
2.CommonsMultipartResolver过程中涉及到的类:
a)MultipartFile:在请求头为multiti/form-data时,request被转换为multipartRequest,FileItem皆为MultiPartFile;
b)FileItem:判断一个文件是否为formfield;
c)DiskFileItem:继承自FileItem,默认的字符集为ISO-8859-1;
c)FileUpload:可以设置文件大小以及文件的编码格式;
d)FileItemFactory:FileItem的创建工厂,根据fieldName,contenType,等字段创建一个FileItem;
e)DiskFileItemFactory:实现FileItemFactory,有默认的文件缓存内存,为10k大小,当上传文件大小超过默认的10k时保存到默认的临时目录中;
3.Spring文件上传的过程总结:
HttpServletRequest =>MultipartHttpServletRequest =>获取MultipartFile集合
Spring CommonsMultipartResolver上传文件小结的更多相关文章
- Spring CommonsMultipartResolver 上传文件
转:http://yanglei008.iteye.com/blog/246920 ...Controller...{ // 创建一个通用的多部分解析器 CommonsMultipartResolve ...
- 利用spring的CommonsMultipartResolver上传文件
1.CommonsMultipartResolver是spring里面提供的一个上传方式,效率我不知道,但是加入spring容器管理还是很不错的. 2.先看依赖包pom.xml <project ...
- Spring MVC 上传文件
Spring MVC上传文件需要如下步骤: 1.前台页面,form属性 method设置为post,enctype="multipart/form-data" input的typ ...
- Spring MVC上传文件原理和resolveLazily说明
问题:使用Spring MVC上传大文件,发现从页面提交,到进入后台controller,时间很长.怀疑是文件上传完成后,才进入.由于在HTTP首部自定义了“Token”字段用于权限校验,Token的 ...
- Spring MVC上传文件
Spring MVC上传文件 1.Web.xml中加入 <servlet> <servlet-name>springmvc</servlet-name> <s ...
- springboot(十七):使用Spring Boot上传文件
上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个Spring Boot上传文件的小案例. 1.pom包配置 我们使用Spring Boot最新版本1.5.9. ...
- (转)Spring Boot(十七):使用 Spring Boot 上传文件
http://www.ityouknow.com/springboot/2018/01/12/spring-boot-upload-file.html 上传文件是互联网中常常应用的场景之一,最典型的情 ...
- Spring Boot(十七):使用Spring Boot上传文件
Spring Boot(十七):使用Spring Boot上传文件 环境:Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0 一.pom包配置 <parent> ...
- 使用Spring Boot上传文件
原文:http://www.cnblogs.com/ityouknow/p/8298344.html 上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个Spri ...
随机推荐
- Ionic login简单登录页面
1.login.html <ion-view view-title="登录" hide-nav-bar="true"> <div class= ...
- vue.js_01_vue.js的入门
1.什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于 ...
- mysql函数替换域名
UPDATE `pigcms_product` SET info = REPLACE ( info, 'oto.mph88.com', 'www.10000fk.net' ) ;
- 关于MySQL IN LIKE OR使用索引的问题
以前在网上看了一些资料,有些人说话不严谨,导致一直被误导,最近在实际开发中发现一些结论有问题,因此特地整理了一下,防止下次继续犯错. 以下前提是有对这个字段建立索引(简直废话,没建的肯定不会使用索引啊 ...
- Html5 拨打手机号码
采用url链接的方式,实现拨打电话功能. 1.最常用WEB页面JS实现一键拨号的电话拨打功能: <a href="tel:12345678987">WEB页面JS拨打& ...
- Scrapy下载中间件的优先级(神踏马值越小优先级越高)
自从之前看的一篇讲Scrapy下载中间件的文章后,一直认为设置里下载中间件的优先级数值越小,越优先,最近要抓的网站反爬增强了,所以需要使用代理ip,但是由于使用的是免费代理以至于经常失效,需要对失效的 ...
- 【One by one系列】一步步部署.net core应用
我们的目标: CentOS系统 nginx服务器 asp.net core应用 mysql服务器 腾讯云服务器 工具准备 [Xshell]--使用windwos下的工具Xshell,原理就是使用SHH ...
- 有趣的纯CSS实现动态晴阴雨雪
我们先来看看实现的效果吧 非常的美腻,对吧.这个是纯css,且单标签实现的哦~ 先贴完整代码,我们再来看看这个里面究竟有什么可以借鉴的知识点 <!DOCTYPE html> <htm ...
- vmware 虚拟机有时候显示有网络访问,但是打不开网页的白痴解决办法
我遇到这种情况的原因是经常更换电脑连接方式(手机wifi.校园网有线网.校园网无线网.电信网.隔壁同学wifi网),所以ip经常变动,所以产生了解决此问题的方法 先连好网络-->打开编辑--&g ...
- nginx在win系统下的安装配置与tomcat集成springmvc框架
先来一个常用命令 验证配置是否正确: nginx -t 查看Nginx的版本号:nginx -V 启动Nginx:start nginx 快速停止或关闭Nginx:nginx -s stop 正常停止 ...