Spring MVC文件上传:commons-fileupload解析全流程

🧩 一、整体上传流程(Spring MVC + commons-fileupload)

当用户通过浏览器上传文件(如<form enctype="multipart/form-data">)时,整个流程如下:

[浏览器] ↓ (HTTP POST with multipart/form-data) [Servlet 容器(如 Tomcat)] ↓ (原始 HttpServletRequest) [Spring DispatcherServlet] ↓ (检测到 multipart 请求) [CommonsMultipartResolver] ↓ (调用 commons-fileupload 解析请求体) [生成 CommonsMultipartFile 对象] ↓ (注入到 Controller 方法参数或自定义 Bean 中) [你的业务代码:importValuation(FileUpLoadBean file)]

⏱️ 二、commons-fileupload 在哪个阶段起作用?

✅ 关键阶段:请求解析阶段(在 Controller 执行之前)

具体来说:

  1. DispatcherServlet 收到请求
    判断Content-Type是否为multipart/form-data

  2. 调用 MultipartResolver
    如果配置了CommonsMultipartResolver,Spring 会委托它处理该请求。

  3. CommonsMultipartResolver 内部使用 commons-fileupload

    • 调用ServletFileUpload.parseRequest(request)(来自commons-fileupload库)
    • 将原始字节流解析为一个个FileItem(代表每个表单项,包括文件和普通字段)
    • 把文件类型的FileItem封装成CommonsMultipartFile对象
  4. 替换原始 Request
    Spring 会把原始的HttpServletRequest包装成MultipartHttpServletRequest,其中包含解析好的文件和参数。

  5. Controller 方法被调用
    Spring 通过数据绑定(Data Binding),将MultipartHttpServletRequest中的文件自动赋值给你的FileUpLoadBean.file字段(类型为CommonsMultipartFile)。

🔍所以,commons-fileupload的作用发生在 Controller 执行之前,是“幕后解析者”


🛠️ 三、commons-fileupload 的核心作用是什么?

commons-fileupload是 Apache 提供的一个通用的 multipart/form-data 请求解析库。它的主要职责是:

功能说明
解析 HTTP multipart 请求体将原始字节流按 RFC 1867 标准拆分为多个“项”(FileItem)
区分普通字段和文件字段比如<input name="username"><input type="file" name="file">
处理大文件上传支持内存/磁盘混合存储(通过DiskFileItemFactory
提供流式读取可以通过getInputStream()逐块读取文件内容,避免 OOM
支持文件名、ContentType 等元信息提取getName(),getContentType(),getSize()

💡 注意:commons-fileupload本身与 Spring 无关,它是一个独立的工具库。
Spring 只是封装了它,通过CommonsMultipartResolverCommonsMultipartFile使其融入 MVC 框架。


📦 四、关键类关系图(简化)

commons-fileupload 库: └── ServletFileUpload └── parseRequest() → List<FileItem> └── FileItem (代表一个表单项) ├── isFormField() → true/false ├── getName() → 字段名(如 "file") ├── getString() → 普通字段值 └── getInputStream() → 文件内容流 Spring 封装层: └── CommonsMultipartResolver └── 使用 ServletFileUpload 解析请求 └── 将 FileItem → CommonsMultipartFile └── getFileItem() → 返回底层 FileItem └── getInputStream() → 代理调用 FileItem.getInputStream()

🧪 五、你项目中的具体体现

  • 你配置了CommonsMultipartResolver→ 启用commons-fileupload解析。
  • 你使用CommonsMultipartFile→ 直接暴露了底层实现。
  • 当用户 POST 到/importValuation.action时:
    • commons-fileupload已经在进入方法前完成了文件解析;
    • file.getFile()返回的就是它解析出的文件对象;
    • 你可以安全地调用.isEmpty(),.getInputStream(),.getOriginalFilename()等方法。

🆚 对比:不用 commons-fileupload 的情况(Servlet 3.0+)

如果使用StandardServletMultipartResolver(Spring Boot 默认):

  • 不需要commons-fileupload依赖;
  • 文件类型是StandardMultipartFile
  • 解析工作由Servlet 容器(如 Tomcat)完成;
  • 功能类似,但配置方式不同(通过multipart-configapplication.properties)。

✅ 总结

问题回答
整个流程?浏览器 → Servlet 容器 → Spring →CommonsMultipartResolvercommons-fileupload解析 → 生成CommonsMultipartFile→ 注入 Controller
在哪个阶段起作用?Controller 执行之前,在 Spring 的请求预处理阶段(由DispatcherServlet触发)
作用是什么?解析 multipart/form-data 请求体,将原始 HTTP 流转换为结构化的文件和字段对象

如果你后续想优化性能(如限制内存使用、支持大文件分片)、或迁移到更现代的方案(如 Spring Boot + Servlet 3.0+),也可以继续问我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1159264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基于vue的电影票购买系统django flask pycharm

目录基于Python与Vue的电影票购买系统开发开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Python与Vue的电影票购买系统开发 该系统采用前后端分离架构&#xff0c;后端使用Python的Dja…

2026 计算机转行网络安全指南:3 类背景对应 4 大黄金岗位(附薪资表)

2026 计算机转行网络安全指南&#xff1a;3 类背景对应 4 大黄金岗位&#xff08;附薪资表&#xff09; “做了 3 年 Java 开发&#xff0c;想转安全却跟着学渗透测试&#xff0c;学了半年 Burp 还是不会挖漏洞”“功能测试转安全&#xff0c;投了 10 家公司全被拒&#xff0c;…

‌2026年API测试全面AI化:从Postman依赖到智能体驱动的质量革命

2026年&#xff0c;API测试已不再是“工具替换”&#xff0c;而是‌测试范式的根本性跃迁‌。94%团队仍在使用Postman&#xff0c;但真正决定效率与质量的&#xff0c;是是否构建了以AI智能体为核心的“感知-决策-执行-学习”闭环系统。AI不是替代测试工程师&#xff0c;而是将…

AI生成测试用例的革命:10家大厂实践对比与40%缺陷修复周期缩短的启示

引言&#xff1a;AI在软件测试中的崛起 在数字化转型加速的2026年&#xff0c;AI技术正重塑软件测试领域。传统手动测试用例编写耗时耗力&#xff0c;常导致缺陷修复周期延长&#xff0c;影响产品迭代效率。一、AI生成测试用例的核心方法与工具概述AI生成测试用例利用机器学习模…

python基于vue的电影院排片电影购票管理系统django flask pycharm

目录基于Python与Vue的电影院排片购票管理系统摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Python与Vue的电影院排片购票管理系统摘要 该系统采用前后端分离架构&#xff0c;前端…

安达发|纺织厂“最强大脑”:APS自动排产的调度革命

在纺织行业的生产车间里&#xff0c;曾经忙碌而混乱的场景或许大家并不陌生。工人师傅们为了安排生产计划焦头烂额&#xff0c;订单交付时间总是难以精准把控。不过&#xff0c;随着科技的发展&#xff0c;APS自动排产系统就像一颗璀璨的新星&#xff0c;照亮了纺织行业高效生产…

Python使用装饰器打印 被装饰函数的输入参数和返回值

import functools import logging from typing import Callablelogger logging.getLogger(__name__)def log_io(func: Callable) -> Callable:"""记录工具函数的输入参数和输出的装饰器。Args:function&#xff1a;要装饰的工具功能Returns:带有输入/输出日…

应届生安全就业:优先选这 3 类岗位,入门易 + 晋升快

应届生安全就业&#xff1a;优先选这 3 类岗位&#xff0c;入门易 晋升快 “投了 20 份渗透测试简历石沉大海&#xff0c;明明背了 OWASP Top 10 却连面试都没有&#xff1b;看到‘安全架构师’岗位心痒痒&#xff0c;要求 5 年经验直接劝退&#xff1b;好不容易拿到面试&…

python基于vue的二手车在线售卖系统的设计与实现django flask pycharm

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 该系统基于Python技术栈&#xff0c;结合Vue.js前端框架&#xff0c;设计并实现了一个功能完善的二手车在线售卖平台。后端采用…

网络安全岗位扫盲:5 类适合转行的入门岗位(附技能清单)

网络安全岗位扫盲&#xff1a;5 类适合转行的入门岗位&#xff08;附技能清单&#xff09; “做了 3 年 Java 开发&#xff0c;想转安全却不知道选‘渗透测试’还是‘安全开发’&#xff1b;运维出身&#xff0c;看招聘要求全是‘熟悉 ATT&CK 框架、掌握漏洞利用’&#xf…

零基础学 Web 渗透测试?全流程拆解,一篇吃透从入门到精通!

对于零基础想要入门Web渗透测试的学习者来说&#xff0c;最头疼的莫过于面对繁杂的工具、晦涩的术语和毫无头绪的操作流程&#xff0c;要么盲目跟风乱学工具&#xff0c;要么未理清规则就贸然尝试&#xff0c;不仅学不到核心技能&#xff0c;还可能触碰法律红线。**其实Web渗透…

IM SDK选型避坑指南:2026年最新10家服务商稳定性排名

随着移动互联网的不断发展&#xff0c;即时通讯已经广泛应用于各个行业。从日常的社交交流&#xff0c;到金融交易、远程医疗、在线教育等关键业务领域&#xff0c;稳定可靠的IM服务对于保障用户体验和业务的持续运行至关重要。本文将深入剖析2026年主流IM服务商的稳定性情况&a…

性能测试调优在提升应用响应速度中的作用

随着科技的发展和互联网的普及&#xff0c;人们对于应用程序的响应速度要求越来越高。无论是网页加载还是移动应用程序的启动&#xff0c;一个快速响应的应用程序可以给用户带来更好的体验&#xff0c;提高用户满意度和留存率。在这个背景下&#xff0c;性能测试调优成为了提升…

零基础也能赚赏金?SRC 漏洞挖掘全技巧,一篇吃透从入门到变现!

SRC漏洞挖掘技巧&#xff0c;带你零基础入门到精通赏金&#xff01; 前言 经常会有粉丝朋友私信我&#xff0c;想探究一下国内的SRC&#xff08;安全响应中心&#xff09;平台究竟支持了多少白帽黑客的生活&#xff1f;又有多少白帽黑客能够不依赖于传统工作&#xff0c;全职…

转行网络安全:从程序员转安全工程师的经验分享

转行网络安全&#xff1a;从程序员转安全工程师的经验分享 一、引言 从程序员转行网络安全工程师&#xff08;如应用安全工程师、代码审计工程师&#xff09;是近年来的热门方向&#xff0c;程序员具备的代码基础、逻辑思维和项目经验&#xff0c;能成为转行安全的核心优势。但…

网安人才缺口 480 万!选对这几个专业,直接锁定未来高薪赛道!

网安人才缺口高达 480 万&#xff01;选对这些专业&#xff0c;未来直接踩中高薪赛道&#xff01; 9月16日&#xff0c;工业和信息化部教育与考试中心等部门联合发布《AI 时代网络安全产业人才发展报告&#xff08;2025&#xff09;》。报告指出&#xff0c;2025年全球网络安全…

网络安全认证推荐:适合转行和大学生的 3 个认证

网络安全认证推荐&#xff1a;适合转行和大学生的 3 个认证 一、引言 网络安全认证是证明个人技能、提升就业竞争力的重要凭证&#xff0c;尤其对转行人群和大学生而言&#xff0c;优质的认证能快速弥补专业背景差距&#xff0c;帮助进入行业。本文精选 3 个适合零基础入门、性…

Git 完全指南:从入门到精通

Git 完全指南&#xff1a;从入门到精通 本文详细介绍 Git 版本控制系统的使用方法&#xff0c;涵盖基础概念、日常操作、分支管理、团队协作等核心内容。 文章目录 Git 完全指南&#xff1a;从入门到精通1. Git 简介1.1 什么是 Git&#xff1f;1.2 Git vs 其他版本控制系统 2. …

企业在启用域名前,必须核查哪些信息?

对企业来说&#xff0c;域名并不只是一个访问入口&#xff0c;而是品牌、业务和合规的重要组成部分。很多问题并不是上线后才出现&#xff0c;而是在启用域名前就已经埋下隐患。结合实际案例&#xff0c;企业在使用域名之前&#xff0c;至少要重点核查以下几类信息。第一&#…

JBoltAI 4.0 智能数据中心:多源数据统一管理的技术

在AI应用开发过程中&#xff0c;数据层的碎片化问题一直是制约效率的核心瓶颈非结构化的文档、网页内容&#xff0c;结构化的数据库表数据&#xff0c;轻量化的Excel表格&#xff0c;以及关系型的知识图谱数据&#xff0c;往往分散在不同的存储载体和管理系统中。这种分散性不仅…