文件上传解析器MultipartResolver

1. 简介

MultipartResolver

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

 boolean isMultipart(HttpServletRequest request); // 是否是 multipart
 MultipartHttpServletRequest 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 对象中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值