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方法进行访问。

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

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

猜你喜欢

转载自blog.csdn.net/qq_20051535/article/details/123971892