十二、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";
    }

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

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

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

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

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

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

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

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

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

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

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

OVER(∩_∩)O~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Spring Boot中,你可以使用MultipartResolver来解析文件上传。MultipartResolver是Spring提供的一个接口,它用于处理multipart请求,包括文件上传。 首先,你需要在你的Spring Boot应用中添加相关的依赖。可以在你的`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> ``` 接下来,在你的Spring Boot配置类中,你可以配置一个`MultipartResolver` bean。例如,你可以创建一个名为`multipartResolver`的bean: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.multipart.commons.CommonsMultipartResolver; @Configuration public class AppConfig { @Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); multipartResolver.setMaxUploadSize(5242880); // 设置最大上传文件大小为5MB return multipartResolver; } } ``` 在上面的示例中,我们使用了`CommonsMultipartResolver`作为`MultipartResolver`的实现。还可以根据需要进行其他配置,比如设置最大上传文件大小。 最后,在你的控制器中,你可以使用`@RequestParam`注解来接收文件上传参数。例如,如果你要上传一个文件和其他表单参数,可以这样做: ```java import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController public class FileUploadController { @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file, @RequestParam("name") String name) { // 处理文件上传逻辑 // 可以通过file和name参数获取上传的文件和其他表单参数 return "File uploaded successfully!"; } } ``` 在上面的示例中,`@RequestParam("file")`用于接收上传的文件,`@RequestParam("name")`用于接收其他表单参数。 这样,当你发送一个包含文件上传的POST请求到`/upload`路径时,Spring Boot将自动解析文件上传,并将文件和其他表单参数传递给`handleFileUpload`方法进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anton丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值