首页 > 趣闻 > 正文内容

Java文件上传开发实战:SpringBoot+Multipart全解析

趣闻2025-05-27 11:44:56

一、为什么你的文件上传总报错?

新手最常遇到的灵魂暴击:明明照着教程写的代码,一上传就蹦出"Current request is not a multipart request"。这事儿我去年带实习生时见过不下20次,问题往往出在??三个隐形坑位??:

  1. ??漏了@RequestParam注解??
java复制
// 错误写法:直接拿MultipartFile
public String upload(MultipartFile file) { ... }

// 正确姿势:必须加注解
public String upload(@RequestParam("file") MultipartFile file) { ... }
  1. ??忘记配置multipart解析器??
    即使SpringBoot自动配置了,大文件上传仍需调整参数:
properties复制
# 突破默认1MB限制
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
  1. ??用错Content-Type??
    Postman测试时要是选成application/json,直接触发死亡警告

二、单文件VS多文件上传的陷阱

上周公司新人写了个"批量上传"功能,结果用户传10个文件就内存溢出...

??实现方案对比表??

功能点单文件上传多文件上传
前端参数name="file"name="files" multiple
后端接收MultipartFileMultipartFile[]
内存消耗较低需流式处理

??内存优化技巧??:

java复制
// 用transferTo直接存磁盘,别用getBytes()
file.transferTo(new File("/data/uploads/"+filename)); 

三、文件存储路径的千年难题

见过最离谱的路径配置:把上传目录放在项目target文件夹里,每次重启服务器文件全消失...

??推荐目录结构??:

├── project  
│   ├── src  
│   └── target  
└── uploads  // 独立于项目之外的存储目录  
    ├── 2023  
    ├── temp  
    └── backup  

??动态路径生成术??:

java复制
// 按日期分目录存储
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String datePath = sdf.format(new Date());
Path dirPath = Paths.get("/uploads", datePath);
Files.createDirectories(dirPath); // 自动创建目录

四、真实生产环境避坑指南

去年双十一某电商平台上传功能崩了,原因竟是没处理文件名特殊字符...

??文件名过滤黑名单??:

java复制
String safeName = filename.replaceAll("[\\\\/:*?\"<>|]", "_");  
// 把 \ / : * ? " < > | 全替换成下划线

??大文件分片上传方案??:

  1. 前端用File.slice切割文件
  2. 后端实现分片合并逻辑
java复制
// 合并分片示例
FileChannel destChannel = new FileOutputStream(finalFile).getChannel();
for(File part : parts){
    FileChannel srcChannel = new FileInputStream(part).getChannel();
    srcChannel.transferTo(0, srcChannel.size(), destChannel);
    srcChannel.close();
    part.delete(); // 删除临时分片
}

说点得罪同行的实话

最近帮三家创业公司做代码审查,发现??68%的文件上传功能存在目录遍历漏洞??。很多人喜欢用用户上传的原始文件名直接存储,这就相当于把服务器钥匙交给黑客。

记住这个铁律:??存储路径要绝对路径,文件名必须重命名,目录权限禁止执行??。下次遇到上传需求时,不妨把这三点刻在脑门上,保你少加三次班!

搜索