SpringMVC《源码剖析》5. 文件上传和下载
本文最后更新于 2023-09-16,文章内容可能已经过时。
SpringMVC《源码剖析》5. 文件上传和下载
1、文件下载
讲道理,现在一般都是专门有对象存储服务器,或者是企业内部自己专门设置自己的存储服务器,不会和 java 服务器放一起的。
使用ResponseEntity实现下载文件的功能
说白了,就是要自定义返回的响应头和响应体,使用的数据返回值类型是ResponseEntity,创建这个对象有三个参数,第一个参数通过流的方式,把下载内容写入到字节数组中,第二个参数是请求头信息,格式固定,文件名可以改变,第三个是响应状态参数
2、文件上传
文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"
@RequestBody篇章讲过这方面的笔记知识
SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息
上传步骤:
a>添加依赖:
b>在SpringMVC的配置文件中添加配置:
那不是只有byName方式了,所以需要一个id,但是getBean肯定是具体的id,所以需要去源码里面找到springMVC的id用的哪个,咱们就给哪个
其实就是spring中的注入问题,这里是springmvc需要使用这个解析器,但是也不可能张口就来,还是和老样子需要注入,@Resource或者@AutoWired这类
又张口就来@Resource是根据ByName而@AutoWired是根据ByType来的而第二个类型需要配合@Qualifier变成用ByName自动装配
c>控制器方法:
也可以通过注解 @RequestPart("xxx")
和发过来的文件名称绑定
多文件还可以通过这个注解,但是我们获取的文件类型可以用MutipartFile[]
数组类型
3、springboot实现【雷神部分】
1. 文件上传-单文件与多文件上传的使用
- 页面代码
/static/form/form_layouts.html
- 控制层代码
文件上传相关的配置类:
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.MultipartProperties
文件大小相关配置项:
2.文件上传-【源码流程】文件上传参数解析器
文件上传相关的自动配置类MultipartAutoConfiguration
有创建文件上传参数解析器StandardServletMultipartResolver
。【文件上传解析器】
如果想实现自定义类型的文件上传,显然我们应该去自己创建一个自己的文件上传参数解析器。
- 原理步骤
- 请求进来使用文件上传解析器判断(
isMultipart
)并封装(resolveMutipart
,返回MultipartHttpServletRequest
)文件上传请求 - 参数解析器来解析请求中的文件内容封装成
MultipartFile
- 将
request
中文件信息封装为一个Map
- 最终通过spring自己封装的
FileCopyUtils
实现文件流的拷贝
- 请求进来使用文件上传解析器判断(
请求到达之后会先做预处理,如果有上传文件 就new StandardMultipartHttpServletRequest
包装类,未来处理就都处理我们包装之后的processedRequest
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
跳到以下的类
this.argumentResolvers
其中主角类RequestPartMethodArgumentResolver
用来生成
- 感谢你赐予我前进的力量