原始代码逐行解释
@PostMapping("/uploads") // ① 声明处理POST请求,路径为"/uploads"
@ResponseBody // ② 直接返回数据到响应体,不进行视图解析
public String uploads(
MultipartFile[] files, // ③ 接收上传文件的数组
HttpServletResponse response // ④ 未使用的响应对象(可删除)
) throws IOException { // ⑤ 声明可能抛出IO异常
// 循环处理每个文件
for (MultipartFile file : files) { // ⑥ 遍历文件数组
// 拼接路径并保存文件
file.transferTo( // ⑦ 核心保存方法
new File("A:/JavaEE" // ⑧ 基础路径
+ file.getOriginalFilename()) // ⑨ 拼接原始文件名
);
}
return "success"; // ⑩ 返回成功标识
}
核心组件详解
① @PostMapping(“/uploads”)
- 作用:声明该方法处理
POST
请求,请求路径为/uploads
- 请求示例:
POST /uploads HTTP/1.1
Content-Type: multipart/form-data
② @ResponseBody
- 功能:将方法返回值直接写入HTTP响应体,而非视图模板
- 响应示例:
success
③ MultipartFile[] files
- 类型:Spring MVC提供的文件接收接口数组
- 要求:前端表单中文件字段名必须为
files
- HTML对应代码:
<input type="file" name="files" multiple>
⑦ file.transferTo()
- 作用:将上传的临时文件转移到目标路径
- 等效操作:
// 手动实现文件保存
byte[] bytes = file.getBytes();
Path path = Paths.get("目标路径");
Files.write(path, bytes);
⑧+⑨ 路径拼接逻辑
- 原始代码:
"A://OTHERS//..." + file.getOriginalFilename()
- 示例结果:
若上传文件名为homework.docx
,则完整路径为:
A://OTHERS//School//课程//财经//大三下//JavaEEhomework.docx
(注意:路径缺少斜杠分隔符)
关键流程图示
潜在问题说明
1. 路径错误
- 问题代码:
"A://OTHERS..." + filename
- 错误现象:
- 正确路径应为
A:/OTHERS/.../JavaEE/ + filename
- 缺少目录分隔符导致路径错误(如生成
JavaEEhomework.docx
)
- 正确路径应为
- 修复建议:
// 添加路径分隔符
String basePath = "A:/OTHERS/School/课程/财经/大三下/JavaEE/";
String fullPath = basePath + file.getOriginalFilename();
2. 文件名安全
- 风险:若上传文件名为
../../etc/passwd
,可能覆盖系统文件 - 验证示例:
file.getOriginalFilename() = "../../secret.txt"
// 最终路径:A:/.../JavaEE../../secret.txt
3. 异常处理缺失
- 问题:任意文件保存失败会导致整个请求失败
- 示例错误:
java.io.IOException: The system cannot find the path specified
代码执行流程
- 接收请求
客户端通过表单提交文件到/uploads
路径:
<form method="post" action="/uploads" enctype="multipart/form-data">
<input type="file" name="files" multiple>
<button>上传</button>
</form>
- Spring处理文件
框架将上传的文件封装为MultipartFile[]
数组 - 循环保存文件
每个文件通过transferTo()
保存到指定路径 - 返回结果
无论成功与否,统一返回字符串"success"
简单测试步骤
1. 创建测试HTML页
<!DOCTYPE html>
<html>
<body>
<form method="post" action="/uploads" enctype="multipart/form-data">
<input type="file" name="files" multiple>
<button>上传</button>
</form>
</body>
</html>
2. 启动应用并访问
mvn spring-boot:run
访问 http://localhost:8080
3. 选择文件上传
- 选择任意文件(如
test.txt
) - 点击上传按钮
4. 验证结果
- 控制台输出
success
- 检查目录
A:\JavaEE
是否存在新文件