spring mvc 文件上传需配置 multipartresolver(id 必须为 multipartresolver)、规范前端 enctype="multipart/form-data"、后端校验空值/类型/路径安全,并妥善处理多文件数组空值与循环健壮性。

Spring MVC 实现文件上传,核心在于 MultipartResolver 解析请求 + MultipartFile 封装文件。它本身不自动“安全”或“高效”,需主动配置与编码控制。关键不在用不用,而在怎么配、怎么验、怎么存。
必须配置 MultipartResolver 解析器
Spring MVC 默认不识别 multipart 请求,必须显式注册解析器 bean,且 ID 必须为 multipartResolver(框架约定):
- 推荐使用
CommonsMultipartResolver(需引入commons-fileupload和commons-io) - 必须设置
defaultEncoding="UTF-8",避免中文文件名乱码(尤其与 JSP 的pageEncoding一致) - 限制总大小:
maxUploadSize="5242880"(5MB),单位字节;这是整个请求所有文件+参数的总和上限 - 可选设
maxUploadSizePerFile(单文件上限,Spring 4.2+ 支持),更精细控制 - 临时目录
uploadTempDir建议显式指定,避免依赖容器默认临时路径(权限/清理不可控)
前端表单与请求规范不能省
不是加个 <input type="file"> 就能传——漏掉任一关键项都会静默失败:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- method 必须为 POST(GET 不支持二进制数据)
-
enctype 必须为
multipart/form-data(最常被遗忘!否则浏览器按普通表单编码,后端收不到文件) - 单文件:
<input type="file" name="file">,后端用@RequestParam("file") MultipartFile file - 多文件:多个同名
name="files"或一个name="files"的 multiple input,后端接收为@RequestParam("files") MultipartFile[] files
后端处理要兼顾校验、容错与路径安全
拿到 MultipartFile 后,直接 transferTo() 是危险的。必须做三件事:
-
判空不靠 == null,而用
isEmpty():未选文件时对象非空,只是 size=0 -
验类型不只看后缀,优先用
getContentType()(如image/jpeg),再辅以白名单后缀(.jpg,.pdf等),防止伪造扩展名 -
目标路径不能拼接原始文件名:攻击者可传
../../../etc/passwd。应提取合法文件名(如用FilenameUtils.getName()或正则过滤),并生成唯一文件名(如 UUID + 时间戳) -
保存前确保父目录存在:
file.getParentFile().mkdirs(),否则transferTo()抛异常
多文件上传要注意数组空值与循环健壮性
接收 MultipartFile[] 时,常见陷阱:
- 前端一个都没选,数组长度为 0(不是 null),需先判断
files.length == 0 - 循环中每个元素仍需单独调用
isEmpty(),因为浏览器可能提交空文件项 - 建议统一封装上传逻辑为工具方法,避免重复校验代码
- 若需事务一致性(如上传成功才写数据库),注意
transferTo()是 I/O 操作,不在 Spring 事务管理范围内,失败需手动回滚已传文件
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










