SpringBoot文件上传示例代码和过程解析

说明

文件上传,在 PostMan 或者 ApiPost 等常用工具里面大家应该都留意过,当body是from-data(表单提交)的时候,我们可以选择文件进行上传,如下图:

 本文主要介绍的是使用SpringBoot后端接收这个文件。

代码

代码非常简单,SpringBoot项目直接拷贝即可使用

需要下载源码的戳这里   update_demo.zip - 蓝奏云

@Slf4j
@RestController
@RequestMapping("/")
public class DemoController {

    @PostMapping(value = "/demo")
    public String uploading(@RequestParam("file") MultipartFile file) {
        String filePath = System.getProperty("java.io.tmpdir") + file.getOriginalFilename();
        log.info("文件上传到了:{}", filePath);
        try (FileOutputStream out = new FileOutputStream(filePath)){
            out.write(file.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
            return "uploading failure";
        }
        log.info("文件上传成功!");
        return "uploading success";
    }

}

测试

使用请求发送工具发送一个请求进行测试,其中file参数选择随便选个文件测试:

 日志成功输出文件上传位置:

 查看对应目录下文件内容:

 经过测试功能正常,我们现在来看下原理。

分析

DispatcherServlet

首先我们打开org.springframework.web.servlet.DispatcherServlet#initStrategies

里面的第一个(图中红色方框)中的就是我们要找的方法:

可以看到对这个对象进行了初始化。

判定

初始化对象之后还不够,需要确定一个请求是不是一个文件上传请求,还是这个类:

 进入这个方法:

进入到这个方法,进入到:org.springframework.web.multipart.commons.CommonsMultipartResolver#isMultipart

可以看到这个方法:org.apache.commons.fileupload.servlet.ServletFileUpload#isMultipartContent

就两个检查:检测POST 方法,判断ContentType 是multipart;

返回到刚才那个check逻辑: 

 正常都调这个方法,位置是:org.springframework.web.multipart.MultipartResolver#resolveMultipart 

这里面进行了判定是不是懒加载,实际上就是把各种需要的参数拼一拼:

官方的解释是:将给定的HTTP请求解析为多部分文件和参数,并将请求包装在一个MultipartHttpServletRequest对象中,该对象提供对文件描述符的访问,并使所包含的参数可以通过标准的ServletRequest方法进行访问。

点击来能看到基本就是获取文件信息解码啥的这堆东西了 

以上就是文件上传的处理过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员麻薯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值