十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】

SpringBoot文件上传使用及流程分析【文件上传参数解析器】

在分析流程之前,先来测试如何使用

现在已经有了一个表单,我们要做的就是写一个接口,将表单提交上来的图片保存起来,暂时就保存到本地磁盘吧,代码如下:

	@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";
    }

接口写好之后提交表单测试
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第1张图片
然后就会发现它报错了,什么原因呢?

因为在 MultipartAutoConfiguration.class 配置类中,默认了文件上传大小,单个文件最大1MB,最不超过10MB,而我们刚才选择的图片有大于1MB的,所有报错了,源码如下:
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第2张图片
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第3张图片
那怎么办呢,很简单,按照它的前缀格式,在配置文件修改它就可以了
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第4张图片
还是刚才的几个图片,再来试试
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第5张图片
提交的图片就被保存到我们指定的文件夹咯

他来了,他来了,接下来就是debug它的源码了。

在前边练习使用的时候,我们已经知道,关于文件上传的功能,被写在了MultipartAutoConfiguration 这个类中,所有的默认配置在 MultipartProperties.class 里边,而且,里边配置了一个 StandardServletMultipartResolver 文件上传解析器,从名字可以看出,它是用来解析 Servlet 方式上传的文件的

十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第6张图片
接下DispatcherServlet打上断点 ,走起

在这里插入图片描述
下一步,判断我们的请求是不是文件上传请求,如果是,包装文件上传请求

十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第7张图片
进入看怎么判断的

在这里插入图片描述
其实就是用工具类,判断我们的请求类型,是不是multipart,是就封装

在这里插入图片描述
解析完后继续往下
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第8张图片
找到controller之后,直接进入 handle 方法,来到 handleInternalinvokeHandlerMethod ,来看它是怎么处理的

十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第9张图片
获取解析器,前边分析过的,继续往下
在这里插入图片描述
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第10张图片
进入
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第11张图片

进入,要执行目标方法,先获取请求参数的值
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第12张图片
获取到解析器
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第13张图片
然后进行参数解析
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第14张图片
进入代理解析方法
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第15张图片
全部获取到了之后,就可以用了,来到我们的目标方法
十二、SpringBoot文件上传使用及流程分析【文件上传参数解析器】_第16张图片
最后就可以调用 MultipartFiletransferTo 方法,利用 FileCopyUtils 实现文件流的拷贝

OVER(∩_∩)O~

你可能感兴趣的:(SpringBoot,spring,boot,java,servlet,后端,mvc)