Spring文件上传功能源码剖析

简介: Spring默认提供了文件上传的功能。用起来非常简单,我们也可以使用第三方的如Apache的CommonsUpload包来处理。这里我们使用Spring自带的解析。

Spring默认提供了文件上传的功能。用起来非常简单,我们也可以使用第三方的如Apache的CommonsUpload包来处理。这里我们使用Spring自带的解析。

基本用法

1、在Spring配置中,加上MultipartResolver接口的Bean。

@Bean(
    name = {"multipartResolver"}
)
@ConditionalOnMissingBean({MultipartResolver.class})
public StandardServletMultipartResolver multipartResolver() {
    StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
    multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
    return multipartResolver;
}

2、前端表单类型method为POST方法,enctype为”multipart/form-data”

<form method="post" action="/form" enctype="multipart/form-data"> 
  <input type="text" name="name"/> 
  <input type="file" name="file"/> <input type="submit"/> 
</form>

3、Controller文件中写好相应的映射,上传文件的内容可以通过MultiPartFile来获取字节流并处理

   
    @PostMapping("/form")
    public String handleFormUpload(
            @RequestParam("name") String name,
            @RequestParam("file") MultipartFile file) throws IOException {
        if (!file.isEmpty()) {
            byte[] bytes = file.getBytes(); // store the bytes somewhere return "redirect:uploadSuccess"; 
        }
        return "redirect:uploadFailure";
    }

原理

1、Spring的DispatchServlet可以检测到当前的请求是否为MultiPart请求。


img_aafdb79560caa6c436965d465644bfa2.png
DispatchServlet


2、如果检测为MultiPart请求,则去解析MultiPart请求


img_541a6ff4ed79aff63f8a8e8c25a7d3af.png
DispatchServlet

2.1 判断是否为MultiPart请求

img_7a2ba4e21c4710389cc73c217c9b21c0.png
StandardServletMultipartResolver

2.2 解析MultiPart请求。

img_07888cc6b7a5b98e1ad4d8405bf6996a.png
StandardServletMultipartResolver

3、具体解析流程。Part为底层原生的API,可以通过HttpServletRequest直接调用。然后将请求的Part参数封装起来。

img_0a82e97038c4cf732cfaed3644eb27bc.png
StandardMultipartHttpServletRequest

3.1 我们可以看到前端mutipart/form-data上传请求的类型为


img_0ef83f1d979e1201a9f548b1c685c982.png
表单请求部分

4、创建了MultiPartFile实现。前端表单上传的MultiPart部分都从Part获取。

img_d7b3edfbd8a01654d546e557f4b449d1.png
StandardMultipartFile

5、在Controller中则可以使用参数映射来获取上传的MultiPart部分。


img_5e23fe364ab0e94bad1f059808189363.png
Controller文件

小结

这次主要解析了StandardServletMultipartResolver,关于Apache下的CommonsMultipartResolver处理过程也大体相当,可自行解析。通过这次分析在后台解析文件的请求处理上,可定制更加灵活的方案来处理。

目录
相关文章
|
6天前
|
小程序 JavaScript Java
高校宿舍信息|基于Spring Boot的高校宿舍信息管理系统的设计与实现(源码+数据库+文档)
高校宿舍信息|基于Spring Boot的高校宿舍信息管理系统的设计与实现(源码+数据库+文档)
13 0
|
12天前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
32 6
|
12天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
38 3
|
6天前
|
小程序 JavaScript Java
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
14 0
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
|
6天前
|
安全 JavaScript Java
在线问卷调查|基于Spring Boot的在线问卷调查系统的设计与实现(源码+数据库+文档)
在线问卷调查|基于Spring Boot的在线问卷调查系统的设计与实现(源码+数据库+文档)
12 0
|
12天前
|
JavaScript Java API
【JavaEE】Spring Boot - 日志文件
【JavaEE】Spring Boot - 日志文件
6 0
|
12天前
|
开发框架 监控 Java
深入探索Spring Boot的监控、管理和测试功能及实战应用
【5月更文挑战第14天】Spring Boot是一个快速开发框架,提供了一系列的功能模块,包括监控、管理和测试等。本文将深入探讨Spring Boot中监控、管理和测试功能的原理与应用,并提供实际应用场景的示例。
21 2
|
12天前
|
Java Spring
Spring文件配置以及获取
Spring文件配置以及获取
16 0
|
12天前
|
存储 前端开发 Java
Spring Boot自动装配的源码学习
【4月更文挑战第8天】Spring Boot自动装配是其核心机制之一,其设计目标是在应用程序启动时,自动配置所需的各种组件,使得应用程序的开发和部署变得更加简单和高效。下面是关于Spring Boot自动装配的源码学习知识点及实战。
18 1
|
12天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
110 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式