1. 简介

MultipartResolver

MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。如果请求数据中包含文件,则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest (继承了 HttpServletRequest) 对象中,最后传递给 Controller,在 MultipartResolver 接口中有如下方法:

 boolean isMultipart(HttpServletRequest request); // 是否是 multipartMultipartHttpServletRequest resolveMultipart(HttpServletRequest request); // 解析请求void cleanupMultipart(MultipartHttpServletRequest request);

MultipartFile

MultipartFile 封装了请求数据中的文件,此时这个文件存储在内存中或临时的磁盘文件中,需要将其转存到一个合适的位置,因为请求结束后临时存储将被清空。在 MultipartFile 接口中有如下方法:

 String getName(); // 获取参数的名称String getOriginalFilename(); // 获取文件的原名称String getContentType(); // 文件内容的类型boolean isEmpty(); // 文件是否为空long getSize(); // 文件大小byte[] getBytes(); // 将文件内容以字节数组的形式返回InputStream getInputStream(); // 将文件内容以输入流的形式返回void transferTo(File dest); // 将文件内容传输到指定文件中

MultipartResolver 是一个接口,它的实现类如下图所示,分为 CommonsMultipartResolver 类和 StandardServletMultipartResolver 类。
其中 CommonsMultipartResolver 使用 commons Fileupload 来处理 multipart 请求,所以在使用时,必须要引入相应的 jar 包;而 StandardServletMultipartResolver 是基于 Servlet 3.0来处理 multipart 请求的,所以不需要引用其他 jar 包,但是必须使用支持 Servlet 3.0的容器才可以,以tomcat为例,从 Tomcat 7.0.x的版本开始就支持 Servlet 3.0了。

2. CommonsMultipartResolver

1.使用方式

1.1 配置文件

1.2 上传表单

要在 form 标签中加入 enctype=“multipart/form-data” 表示该表单要提交文件。

1.3 处理文件

2.源码分析

CommonsMultipartResolver 实现了 MultipartResolver 接口,resolveMultipart() 方法如下所示,其中 resolveLazily 是判断是否要延迟解析文件(通过XML可以设置)。当 resolveLazily 为 flase 时,会立即调用 parseRequest() 方法对请求数据进行解析,然后将解析结果封装到 DefaultMultipartHttpServletRequest 中;而当 resolveLazily 为 true 时,会在 DefaultMultipartHttpServletRequest 的 initializeMultipart() 方法调用 parseRequest() 方法对请求数据进行解析,而 initializeMultipart() 方法又是被 getMultipartFiles() 方法调用,即当需要获取文件信息时才会去解析请求数据,这种方式用了懒加载的思想


在上面的代码中可以看到,对请求数据的解析工作是在 parseRequest() 方法中进行的,继续看一下 parseRequest() 方法源码

在 parseRequest() 方法中,首先调用了 prepareFileUpload() 方法来根据编码类型确定一个 FileUpload 实例,然后利用这个 FileUpload 实例解析请求数据后得到文件信息,最后将文件信息解析成 CommonsMultipartFile (实现了 MultipartFile 接口) 并包装在 MultipartParsingResult 对象中。

3.StandardServletMultipartResolver

1.使用方式

1.1 配置文件


这里并没有配置文件大小等参数,这些参数的配置在 web.xml 中

1.2 上传表单

要在 form 标签中加入 enctype=“multipart/form-data” 表示该表单要提交文件。

1.3 处理文件

1.3.1 通过 MultipartFile 类型的参数

1.3.2 通过 MultipartHttpServletRequest 类型的参数

2. 源码分析

StandardServletMultipartResolver 实现了 MultipartResolver 接口,resolveMultipart() 方法如下所示,其中 resolveLazily 是判断是否要延迟解析文件(通过XML可以设置)。

对请求数据的解析工作是在 parseRequest() 方法中进行的,继续看一下 parseRequest() 方法源码

parseRequest() 方法利用了 servlet3.0 的 request.getParts() 方法获取上传文件,并将其封装到 MultipartFile 对象中。

文件上传解析器MultipartResolver相关推荐

  1. spring文件上传拦截器及异常处理

    1文件上传 当enctype="multipart/form-data"时request.getParameter()方法失效 单文件上传 导入坐标 <dependency& ...

  2. [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  3. 记一次对DZ的渗透.(一句话木马与图片,文件上传解析漏洞)

    一.举例:St0rs Team 指剑碎星河分享 前言0X01 某日某帅正在使用着啊D 入侵百度的时候, 突然某位好友发来一条消息. "滴滴上车" 打开消息一看,说是要某帅帮忙日一个 ...

  4. .htaccess文件上传解析漏洞

    测试环境 upload-labs靶场(Pass-04) .htaccess原理 .htaccess文件是Apache服务器下的一个配置文件.其主要负责相关目录下的网页配置,即:在一个特定的文档目录中放 ...

  5. 0919文件上传-解析漏洞编辑器安全WAF绕过及安全修复

    其他漏洞 编辑器漏洞 网站在实现上传文章等功能时会套用第三方编辑器的功能 大部分编辑器漏洞都是文件上传漏洞 判断: 1.看界面 2.目录扫描 fkceditor.ewebeditor.ckeditor ...

  6. 纯前端JS实现文件上传解析渲染页面

    AI真的能代替前端吗? 回答:不会完全代替 能用吗?复制到项目中只会报错 爆红 --他完全不能理解你需要什么 JavaScript(简称JS)是一种轻量级的脚本语言,主要用于在Web页面上添加交互行为 ...

  7. 文件上传中关于MultipartResolver的配置

    MultipartResolver配置 1.setMaxUploadSize 用于配置上传的文件的最大大小,例如:当设置值为5M时,则上传的文件均不可以超过5M, 即使一次性上传10个文件,则10个文 ...

  8. springmvc代码详细(五种映射,绑定参数,处理json数据,文件上传,转发,拦截器的实现)

    项目结构图: 父工程的pom.xml文件: <!-- 集中定义依赖版本号 --><properties><junit.version>4.10</junit. ...

  9. SpringBoot文件上传源码解析

    一.SpringMVC文件上传源码分析前言(这部分我觉得原作者写的很好) 该如何研究SpringMVC的文件上传的源码呢? 研究源码并不是仅仅知道程序是怎样运行的,而应该从宏观的角度.不同的立场去看待 ...

  10. Springboot2拦截器与文件上传

    拦截器-登录检查与静态资源放行 1.编写一个拦截器实现HandlerInterceptor接口 2.拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors()) 3. ...

最新文章

  1. MySQL添加字段和修改字段的方法
  2. Web开发之Goahead
  3. mysql 自动化运维工具_MySQL使用工具Inception实现自动化运维
  4. 第8集析构函数中抛出的异常
  5. 低版本浏览器支持css3 Media查询的方法, ie6-ie8 不支持css3 的时候用respond.js,html5shiv.js 【非常实用哦】。。。。。。。。。。。。...
  6. Hybris Commerce下单时遇到产品库存不足的解决办法
  7. 立体栅格地图_更新丨智图栅格数据—彩色版地图,智臻智美,带来更好的业务体验...
  8. 7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么
  9. 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)
  10. Powershell 时间相关
  11. 7-12 求给定精度的简单交错序列部分和 (15 分)
  12. 注意力机制介绍(attention)
  13. 在注册表更改Program Files的位置
  14. 单例模式(java代码实现)
  15. 暗黑版微信,官方发布! (附下载链接)
  16. 小虾米闯江湖服务器维护中,《小虾米闯江湖》6月23日关于出师、判师细节更新补充...
  17. NYOJ1016:德莱联盟(判线段相交)
  18. 结构体类型数据单链表的操作
  19. H5互动游戏平台推荐:盘点那些超火的多人小游戏互动对战平台
  20. 2020.11.26---java复习

热门文章

  1. (CVPR-2018)Non-local Neural Networks
  2. 集线器、交换机、路由器、网桥、网关之间的区别
  3. 从西天取经事件看官场潜规则
  4. 腾讯恢复微信个人号注册
  5. 硬盘重装系统:电脑本地硬盘重装系统步骤
  6. 论文笔记:Auto-Encoding Scene Graphs for Image Captioning
  7. Spring Boot网上图书商城
  8. SHOI 2008 仙人掌图 BZOJ 1023
  9. 关于前端部分页面模板化构思及可配置的json模板
  10. Python之selenium进阶