在分析流程之前,先来测试如何使用
现在已经有了一个表单,我们要做的就是写一个接口,将表单提交上来的图片保存起来,暂时就保存到本地磁盘吧,代码如下:
@PostMapping("/upload")
public String upload(@RequestParam("email") String email,
@RequestParam("username") String username,
@RequestPart("headerImg") MultipartFile headerImg,
@RequestPart("photos") MultipartFile[] photos) throws IOException {
log.info("上传的信息:email={},username={},headerImg={},photos={}",
email,username,headerImg.getSize(),photos.length);
if(!headerImg.isEmpty()){
//保存到文件服务器,OSS服务器
String originalFilename = headerImg.getOriginalFilename();
headerImg.transferTo(new File("D:\\cache\\"+originalFilename));
}
if(photos.length > 0){
for (MultipartFile photo : photos) {
if(!photo.isEmpty()){
String originalFilename = photo.getOriginalFilename();
photo.transferTo(new File("D:\\cache\\"+originalFilename));
}
}
}
return "main";
}
接口写好之后提交表单测试
然后就会发现它报错了,什么原因呢?
因为在 MultipartAutoConfiguration.class 配置类中,默认了文件上传大小,单个文件最大1MB,最不超过10MB,而我们刚才选择的图片有大于1MB的,所有报错了,源码如下:
那怎么办呢,很简单,按照它的前缀格式,在配置文件修改它就可以了
还是刚才的几个图片,再来试试
提交的图片就被保存到我们指定的文件夹咯
他来了,他来了,接下来就是debug它的源码了。
在前边练习使用的时候,我们已经知道,关于文件上传的功能,被写在了MultipartAutoConfiguration 这个类中,所有的默认配置在 MultipartProperties.class 里边,而且,里边配置了一个 StandardServletMultipartResolver 文件上传解析器,从名字可以看出,它是用来解析 Servlet 方式上传的文件的
接下DispatcherServlet打上断点 ,走起
下一步,判断我们的请求是不是文件上传请求,如果是,包装文件上传请求
进入看怎么判断的
其实就是用工具类,判断我们的请求类型,是不是multipart,是就封装
解析完后继续往下
找到controller之后,直接进入 handle 方法,来到 handleInternal 的 invokeHandlerMethod ,来看它是怎么处理的
获取解析器,前边分析过的,继续往下
进入
进入,要执行目标方法,先获取请求参数的值
获取到解析器
然后进行参数解析
进入代理解析方法
全部获取到了之后,就可以用了,来到我们的目标方法
最后就可以调用 MultipartFile 的 transferTo 方法,利用 FileCopyUtils 实现文件流的拷贝
OVER(∩_∩)O~