• 十二、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";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    接口写好之后提交表单测试
    在这里插入图片描述
    然后就会发现它报错了,什么原因呢?

    因为在 MultipartAutoConfiguration.class 配置类中,默认了文件上传大小,单个文件最大1MB,最不超过10MB,而我们刚才选择的图片有大于1MB的,所有报错了,源码如下:
    在这里插入图片描述
    在这里插入图片描述
    那怎么办呢,很简单,按照它的前缀格式,在配置文件修改它就可以了
    在这里插入图片描述
    还是刚才的几个图片,再来试试
    在这里插入图片描述
    提交的图片就被保存到我们指定的文件夹咯

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

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

    在这里插入图片描述
    接下DispatcherServlet打上断点 ,走起

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

    在这里插入图片描述
    进入看怎么判断的

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

    在这里插入图片描述
    解析完后继续往下
    在这里插入图片描述
    找到controller之后,直接进入 handle 方法,来到 handleInternalinvokeHandlerMethod ,来看它是怎么处理的

    在这里插入图片描述
    获取解析器,前边分析过的,继续往下
    在这里插入图片描述
    在这里插入图片描述
    进入
    在这里插入图片描述

    进入,要执行目标方法,先获取请求参数的值
    在这里插入图片描述
    获取到解析器
    在这里插入图片描述
    然后进行参数解析
    在这里插入图片描述
    进入代理解析方法
    在这里插入图片描述
    全部获取到了之后,就可以用了,来到我们的目标方法
    在这里插入图片描述
    最后就可以调用 MultipartFiletransferTo 方法,利用 FileCopyUtils 实现文件流的拷贝

    OVER(∩_∩)O~

  • 相关阅读:
    ARMv7系统寄存器
    一文读懂强化学习:RL全面解析与Pytorch实战
    React基础
    win11安装教程(附tpm2.0开启或跳过教程)
    JDK配置
    沉睡者IT - 抖音中视频计划赚钱项目初级教程
    k8s1.26.1部署 ingress-nginx-controller(1.6.4)
    HAL (software)
    ElementUI浅尝辄止35:Checkbox 多选框
    【K8S】二进制安装
  • 原文地址:https://blog.csdn.net/NICK_53/article/details/126194501