Spring MVC 文件上传需配置 multipartResolver Bean(ID 必须为 multipartResolver),前端表单须满足 method="post"、enctype="multipart/form-data"、input name 与 Controller @RequestParam 一致;下载需设置 Content-Disposition 响应头并防范路径穿透。

Spring MVC 本身不自带文件上传能力,必须手动配置 multipartResolver 解析器,并搭配前端表单和 Controller 处理逻辑才能实现上传与下载。大小限制、编码、异常处理等关键项都集中在解析器配置中,不能遗漏。
上传核心配置:multipartResolver Bean
在 spring-mvc.xml(或 Java 配置类)中定义 ID 为 multipartResolver 的 Bean,这是硬性要求——ID 写错就无法生效:
-
必须使用
CommonsMultipartResolver(需引入commons-fileupload依赖) -
defaultEncoding设为UTF-8,否则中文文件名乱码 -
maxUploadSize单位是字节,例如10485760= 10MB;这是所有文件总和上限,不是单个文件 -
maxInMemorySize控制内存缓存阈值(如40960字节),超限自动写入临时磁盘 - 建议开启
resolveLazily="true",让异常(如超限)在 Controller 执行前就抛出,便于统一拦截
前端表单的三个必要条件
缺一不可,否则后端收不到文件:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
-
method="post"—— GET 不支持二进制传输 -
enctype="multipart/form-data"—— 普通application/x-www-form-urlencoded会丢弃文件内容 -
<input type="file" name="xxx">——name值必须和 Controller 中@RequestParam("xxx")的参数名完全一致 - 如需多文件,加
multiple属性:<input type="file" name="files" multiple>
Controller 中接收与大小校验
上传逻辑本身简单,但大小控制要靠两层保障:
- 第一层是
multipartResolver的maxUploadSize,超限直接抛MaxUploadSizeExceededException,可配SimpleMappingExceptionResolver跳转错误页 - 第二层可在 Controller 中手动检查:
if (file.getSize() > 10 * 1024 * 1024),适合做更细粒度策略(如不同用户类型不同限额) - 单文件用
MultipartFile file,多文件用MultipartFile[] files或List<multipartfile></multipartfile> - 保存时建议用
file.getOriginalFilename()获取原始名,避免路径穿透风险;推荐加 UUID 或时间戳重命名
文件下载基础配置与实现
下载无需特殊 Bean,但需注意响应头和资源读取方式:
- Controller 方法返回
ResponseEntity<byte></byte>或使用OutputStream写入响应体 - 必须设置响应头:
Content-Disposition: attachment; filename="xxx.jpg"(中文名需 URLEncoder 编码) - 推荐配置
ByteArrayHttpMessageConverter,方便直接返回 byte 数组 - 大文件下载建议用流式读取 +
response.getOutputStream(),避免内存溢出 - 注意权限校验和路径白名单,禁止通过参数拼接任意服务端路径(如
../webapps/ROOT/WEB-INF/web.xml)
















