spring boot 文件上传下载需三步:调大 multipart 限制、安全存储(重命名+分目录+类型校验)、正确响应下载(设 content-disposition 和 content-type)。需禁用路径拼接、校验文件存在性,建议病毒扫描。

Spring Boot 实现文件上传和下载,核心就三件事:让文件能传进来、安全存好、再按需发出去。不需要额外插件,基础 spring-boot-starter-web 就够用,但默认配置太保守,必须调整。
上传前必配的参数
Spring Boot 默认只允许 1MB 的单文件上传,超了直接 400 错误。在 application.yml 里加这几行:
-
spring.servlet.multipart.max-file-size: 50MB(单个文件上限) -
spring.servlet.multipart.max-request-size: 100MB(一次请求所有文件总大小) -
file.upload-dir: D:/upload(自定义存储路径,用@Value注入)
上传接口要做的几件实事
接收 MultipartFile 后不能直接用原始文件名保存,得防覆盖、防乱码、防路径穿越:
- 判空:检查
file.isEmpty() - 重命名:用
UUID.randomUUID().toString()+ 原扩展名,比如a1b2c3.png - 分目录:按日期建子目录,如
upload/2026/10/12/a1b2c3.png,避免单目录文件过多 - 校验类型:通过
file.getContentType()或后缀白名单限制,比如只收image/*或.pdf,.xlsx
下载接口的关键细节
下载不是简单返回文件流,浏览器才能正确识别并弹窗保存:
- 用
ResponseEntity<resource></resource>或手动写入HttpServletResponse.getOutputStream() - 设置响应头:
Content-Disposition: attachment; filename="中文名.pdf" - 中文文件名必须用
URLEncoder.encode(name, "UTF-8")编码,否则 IE/Edge 会乱码 - 加上
Content-Type: application/octet-stream,避免浏览器尝试渲染
安全与健壮性不能省
线上环境必须堵住常见漏洞:
- 禁用用户提交的文件路径拼接,所有存储路径由服务端生成,不信任
file.getOriginalFilename()中的任何路径字符(如../) - 大文件上传考虑加进度监听或改用分片上传(需前端配合)
- 下载时校验文件是否存在,不存在返回 404,别暴露真实路径
- 敏感系统建议对上传文件做病毒扫描(集成 ClamAV 等)或内容头检测(Magic Number)











