Spring MVC与Spring Boot文件上传配置差异对比及文件上传关键类详细说明与对比
一、Spring MVC与Spring Boot文件上传配置差异对比
1. 配置方式差异
| 框架 | 配置方式 | 依赖管理 | 自动配置 |
|---|---|---|---|
| Spring MVC | 需手动配置MultipartResolver(如StandardServletMultipartResolver) | 需自行引入commons-fileupload等依赖 | 无,默认不启用文件上传支持 |
| Spring Boot | 通过application.properties或application.yml配置(如spring.servlet.multipart.*) | 自动包含spring-boot-starter-web中的文件上传依赖 | 自动配置StandardServletMultipartResolver |
2. 核心配置差异
| 配置项 | Spring MVC | Spring Boot |
|---|---|---|
| MultipartResolver | 需手动声明@Bean或XML配置:StandardServletMultipartResolver | 自动创建,无需显式配置(除非需自定义) |
| 文件大小限制 | 需手动设置maxUploadSize等参数 | 通过spring.servlet.multipart.max-file-size和spring.servlet.multipart.max-request-size配置 |
| Servlet版本要求 | 需Servlet 3.0+(StandardServletMultipartResolver依赖Servlet API) | 自动适配Servlet版本,但需确保Servlet容器支持(如Tomcat 7+) |
二、关键类详细说明与对比
**1. DispatcherServlet与适配器模式
- 作用:
DispatcherServlet通过适配器模式将HttpServletRequest转换为MultipartHttpServletRequest,以便支持文件上传操作。 - 转换流程:
DispatcherServlet检测到请求是多部分(multipart)请求。- 调用
MultipartResolver解析原始请求。 - 返回包装后的
MultipartHttpServletRequest对象,供控制器方法使用。
**2. MultipartHttpServletRequest接口
- 功能:
扩展HttpServletRequest,提供文件操作方法(如getFile()、getFiles())。 - 使用场景:
在Spring MVC中直接操作文件上传的请求对象,无需直接依赖Servlet的Part接口。 - 代码示例:
@PostMapping("/upload") public String handleUpload(MultipartHttpServletRequest request) {List<MultipartFile> files = request.getFiles("file");// 处理文件return "success"; }
**3. MultipartResolver接口与StandardServletMultipartResolver
- MultipartResolver接口:
- 作用:负责将
HttpServletRequest解析为MultipartHttpServletRequest。 - 实现类:
StandardServletMultipartResolver(基于Servlet 3.0 API)。
- 作用:负责将
- StandardServletMultipartResolver:
-
Spring MVC配置:需手动声明:
@Bean public MultipartResolver multipartResolver() {return new StandardServletMultipartResolver(); } -
Spring Boot配置:默认自动配置,无需手动声明。
-
**4. Part接口(Servlet API)
- 功能:Servlet 3.0+提供的标准接口,直接操作文件上传的“部分”数据。
- 使用场景:
需要直接使用Servlet原生API处理文件,或避免依赖Spring的MultipartFile。 - 代码示例:
@PostMapping("/upload") public String handleUpload(HttpServletRequest request) {Collection<Part> parts = request.getParts();for (Part part : parts) {// 处理Part对象}return "success"; }
**5. MultipartFile接口(Spring MVC)
- 功能:Spring提供的封装接口,简化文件操作(如获取文件名、输入流等)。
- 依赖关系:
- 需引入Spring MVC或Spring Boot的
spring-web依赖。 - 实现类为
StandardMultipartFile(基于Servlet的Part实现)。
- 需引入Spring MVC或Spring Boot的
- 推荐程度:
- 优点:更易用,提供丰富的封装方法(如
getOriginalFilename())。 - 缺点:属于Spring扩展,版本兼容性需注意。
- 优点:更易用,提供丰富的封装方法(如
三、对比表格总结
| 类/接口 | 功能描述 | 适用框架 | 配置方式 | 推荐程度 | 依赖要求 |
|---|---|---|---|---|---|
| DispatcherServlet | 负责请求分发与适配器模式转换 | Spring MVC/Spring Boot | 内置,无需配置 | 必要组件 | Spring框架核心依赖 |
| MultipartHttpServletRequest | 扩展HttpServletRequest,提供文件操作方法 | Spring MVC/Spring Boot | 通过MultipartResolver创建 | 中(依赖MultipartResolver) | Spring MVC/Spring Boot依赖 |
| MultipartResolver | 解析多部分请求并生成MultipartHttpServletRequest | Spring MVC/Spring Boot | 需手动配置(Spring MVC) | 必要组件 | Spring MVC核心依赖 |
| StandardServletMultipartResolver | 实现MultipartResolver,基于Servlet 3.0 API | Spring MVC/Spring Boot | Spring Boot自动配置 | 高(自动配置友好) | Servlet 3.0+容器 |
| Part接口 | Servlet原生接口,操作文件上传的“部分”数据 | 所有Servlet 3.0+应用 | 无需配置 | 高(标准接口) | Servlet 3.0+ API |
| MultipartFile接口 | Spring封装接口,简化文件操作 | Spring MVC/Spring Boot | 通过MultipartResolver自动注入 | 中(易用但依赖Spring) | Spring框架依赖 |
四、关键结论
- Spring Boot简化配置:
- 自动配置
StandardServletMultipartResolver,无需手动声明。 - 通过
application.properties集中配置文件大小等参数。
- 自动配置
- 适配器模式的作用:
DispatcherServlet通过MultipartResolver将原始请求转换为支持文件操作的MultipartHttpServletRequest。
- 接口选择建议:
Part接口:推荐优先使用,因其是Servlet标准,兼容性高且无需额外依赖。MultipartFile:适合需要Spring封装功能的场景,但需注意版本兼容性。
- Servlet版本要求:
StandardServletMultipartResolver要求Servlet 3.0+,需确保容器(如Tomcat 7+)支持。
相关文章:
Spring MVC与Spring Boot文件上传配置差异对比及文件上传关键类详细说明与对比
一、Spring MVC与Spring Boot文件上传配置差异对比 1. 配置方式差异 框架配置方式依赖管理自动配置Spring MVC需手动配置MultipartResolver(如StandardServletMultipartResolver)需自行引入commons-fileupload等依赖无,默认不启用文件上传支…...
LLM 的model.generate() 参数说明
LLM 的model.generate() 参数说明 目录 LLM 的model.generate() 参数说明生成长度控制参数采样策略参数重复惩罚参数束搜索参数其他参数model.generate() 方法是 Hugging Face Transformers 库中用于文本生成的核心方法,它有众多参数可用于控制生成过程 生成长度控制参数 min…...
下载firefox.tar.xz后如何将其加入到Gnome启动器
起因:近期(2025-04-07)发现firefox公布了130.0 版本,可以对pdf文档进行签名了,想试一下,所以卸载了我的Debian12上的firefox-esr,直接下载了新版本的tar.xz 包。 经过一番摸索,实现了将其加入Gn…...
Flutter性能优化终极指南:从JIT到AOT的深度调优
一、Impeller渲染引擎调优策略 1.1 JIT预热智能预编译 // 配置Impeller预编译策略 void configureImpeller() {ImpellerEngine.precacheShaders(shaders: [lib/shaders/skinned_mesh.vert,lib/shaders/particle_system.frag],warmupFrames: 30, // 首屏渲染前预编译帧数cach…...
加密≠安全:文件夹密码遗忘背后的数据丢失风险与应对
在数字化时代,保护个人隐私和数据安全变得尤为重要。许多人选择对重要文件夹进行加密,以防止未经授权的访问。然而,一个常见且令人头疼的问题也随之而来——文件夹加密密码遗忘。当你突然发现自己无法访问那些加密的文件夹时,那种…...
实习技能记录【2】-----LVGL[基本概念]
LVGL主要概念 1. Screen (屏幕): 概念: 屏幕是 LVGL 应用程序中的顶层容器。它是用户界面的根对象,所有的可见 UI 元素最终都会添加到某个屏幕上(通常是活动屏幕)。 功能: 作为其他 UI 元素的父对象。 可以拥有自己的背景颜色、背景图片等样…...
【操作系统(Linux)】——通过案例学习父子进程的线程异步性
本篇旨在通过几个案例来学习父子进程的线程异步性 一、父进程与子进程 我们将要做的: 创建父子进程,观察父子进程执行的顺序,了解进程执行的异步行为 源代码: #include <stdio.h> #include <sys/types.h> #include…...
Go 语言范围 (Range)
Go 语言范围 (Range) Go 语言是一种静态强类型、编译型、并发型编程语言,由 Google 开发。它的简洁性和高效性使其成为众多开发者的首选。在 Go 语言中,range 是一个非常有用的关键字,用于遍历数组、切片、字符串以及通道(channe…...
【开源宝藏】30天学会CSS - DAY12 第十二课 从左向右填充的文字标题动画
用伪元素搞定文字填充动效:一行 JS 不写,效果炸裂 你是否曾经在设计页面标题时,觉得纯文字太寡淡?或者想做一个有动感的文字特效,但又不想引入 JS 甚至 SVG? 在这篇文章中,我们将通过 一段不到…...
nginx或tengine服务器,配置HTTPS下使用WebSocket的线上环境实践!
问题描述: HTTPS 下发起WS连接,连接失败,Chrom 浏览器报错。 socket.js:19 Mixed Content: The page at https://app.XXX.com was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint ws://172.16.10.80:903…...
WSA(Windows 安卓子系统)过检测教程
windows安卓子系统WSA的root和magisk的安装教程 安卓子系统WSLWSA的rootmagisk安装 WSA(Windows 安卓子系统)过检测的方法与思路 一、引言 Windows 安卓子系统(WSA)为 Windows 用户提供了在电脑上运行安卓应用的便利。然而&…...
蓝桥杯 B3620 x 进制转 10 进制
题目描述 给一个小整数 x 和一个 x 进制的数 S。将 S 转为 10 进制数。对于超过十进制的数码,用 A,B,… 表示。 输入格式 第一行一个整数 x; 第二行一个字符串 S。 输出格式 输出仅包含一个整数,表示答案。 输入输出样例 …...
【Oracle篇】跨字符集迁移:基于数据泵的ZHS16GBK转AL32UTF8全流程迁移
💫《博主主页》:奈斯DB-CSDN博客 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了解 💖如果觉得文章对你有所帮…...
Qt子模块的功能介绍
一、Qt 主要子模块的功能介绍 1. 核心模块 模块名称功能描述QtCore核心非GUI功能(信号槽、线程、文件IO、容器类、JSON/XML处理等)QtGui基础图形绘制(窗口系统集成、OpenGL抽象、图像处理、字体管理等)QtConcurrent高级多线程API(并行计算框架,如QtConcurrent::run)QtN…...
FRP练手:hello,world实现
方案一:使用 Flask(推荐) from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return "你好啊世界"if __name__ __main__:# 监听所有网络接口(0.0.0.0),端口 3344app.…...
《深入探秘:分布式软总线自发现、自组网技术原理》
在当今数字化浪潮中,分布式系统的发展日新月异,而分布式软总线作为实现设备高效互联的关键技术,其自发现与自组网功能宛如打开智能世界大门的钥匙,为多设备协同工作奠定了坚实基础。 分布式软总线的重要地位 分布式软总线是构建…...
西门子S7-1200PLC 工艺指令PID_Temp进行控温
1.硬件需求: 西门子PLC:CPU 1215C DC/DC/DC PLC模块:SM 1231 TC模块 个人电脑:已安装TIA Portal V17软件 加热套:带加热电源线以及K型热电偶插头 固态继电器:恩爵 RT-SSK4A2032-08S-F 其他࿱…...
提升Windows安全的一些措施
由简单到复杂,仅供参考 一、杀毒软件: 1、杀毒能力: https://haokan.hao123.com/v?vid3883775443252827335&pdhaokan_share 2、使用注意: 一台主机只安装一个杀毒软件就可以了 杀毒软件会误报,造成正常文件…...
Jupyter notebook定制字体
一、生成配置文件 运行Anaconda Powershell Prompt终端,输入下面一行代码: jupyter notebook --generate-config 将生成文件“C:\Users\XXX\.jupyter\jupyter_notebook_config.py”,XXX为计算机账户名字。 二、修改配置文件 c.NotebookAp…...
内存分配中的堆(Memory Heap)详解
在计算机科学中,"堆"这个术语确实容易让人混淆,因为它同时用于描述两种完全不同的概念:数据结构中的堆和内存管理中的堆。上次我们讨论了数据结构中的堆,今天我将详细解释内存分配中的堆(Memory Heap&#x…...
vant4+vue3上传一个pdf文件并实现pdf的预览。使用插件pdf.js
注意下载的插件的版本"pdfjs-dist": "^2.2.228", npm i pdfjs-dist2.2.228 然后封装一个pdf的遮罩。因为pdf文件有多页,所以我用了swiper轮播的形式展示。因为用到移动端,手动滑动页面这样比点下一页下一页的方便多了。 直接贴代码…...
JS | 函数柯里化
函数柯里化(Currying):将一个接收多个参数函数,转换为一系列只接受一个参数的函数的过程。即 逐个接收参数。 例子: 普通函数: function add(a, b, c) {return a b c; } add(1, 2, 3); // 输出 6柯里化…...
软件工程基础之设计模式
目录 单例模式(Singleton Pattern)工厂方法模式(Factory Method Pattern)抽象工厂模式(Abstract Factory Pattern)原型模式(Prototype Pattern)适配器模式(Adapter Pattern)单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。应用场景:…...
2025 数字中国创新大赛数字安全赛道数据安全产业积分争夺赛初赛-东部赛区WriteUp
2025 数字中国创新大赛数字安全赛道数据安全产业积分争夺赛初赛-东部赛区WriteUp 数据安全:ez_upload(60分): 模型安全:数据分析:溯源与取证:1-1:1-2: 数据社工:2-2:2-3:2-4: 数据跨境ÿ…...
2025 年网络安全终极指南
我们生活在一个科技已成为日常生活不可分割的一部分的时代。对数字世界的依赖性日益增强的也带来了更大的网络风险。 网络安全并不是IT专家的专属特权,而是所有用户的共同责任。通过简单的行动,我们可以保护我们的数据、隐私和财务,降低成为…...
1.6-抓包技术(Burp Suite\Yakit抓包\Web、APP、小程序)
1.6-抓包技术(Burp Suite\Yakit抓包\Web、APP、小程序) 如果要使用抓包软件,基本上第一步都是要安装证书的。原因如下: 客户端(浏览器或应用)会检测到证书不受信任,并弹出 证书错误࿰…...
图解力扣回溯及剪枝问题的模板应用
文章目录 选哪个的问题17. 电话号码的字母组合题目描述解题代码图解复杂度 选不选的问题78. 子集题目描述解题代码图解复杂度 两相转化77. 组合题目描述解题代码法一:按选哪个的思路法二:按选不选的思路 图解选哪个:选不选 复杂度 选哪个的问…...
Elasticsearch 8.X 如何利用嵌入向量提升搜索能力?
众所周知,Elasticsearch 是一个非常流行的搜索引擎,因为它速度快、扩展性强,尤其擅长全文搜索。 近两年,向量嵌入(Vector Embedding)技术的引入,让 Elasticsearch 在处理高级搜索场景时变得更强…...
MySQL体系架构(一)
1.1.MySQL的分支与变种 MySQL变种有好几个,主要有三个久经考验的主流变种:Percona Server,MariaDB和 Drizzle。它们都有活跃的用户社区和一些商业支持,均由独立的服务供应商支持。同时还有几个优秀的开源关系数据库,值得我们了解一下。 1.1.1.Drizzle Drizzle是真正的M…...
【Docker项目实战】使用Docker部署ToDoList任务管理工具
【Docker项目实战】使用Docker部署ToDoList任务管理工具 一、ToDoList介绍1.1 ToDoList简介1.2 ToDoList主要特点二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载ToDoList镜像…...
