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处理过程也大体相当,可自行解析。通过这次分析在后台解析文件的请求处理上,可定制更加灵活的方案来处理。

相关文章
|
17天前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
165 2
|
2月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
6月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
416 70
|
5月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
215 32
|
5月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
|
4月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
693 0
|
6月前
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
401 4
|
7月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
142 0

热门文章

最新文章