Spring MVC 一个简单的多文件上传


原始代码逐行解释

java 复制代码
@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
  • 请求示例
http 复制代码
POST /uploads HTTP/1.1
Content-Type: multipart/form-data
② @ResponseBody
  • 功能:将方法返回值直接写入HTTP响应体,而非视图模板
  • 响应示例
plain 复制代码
success
③ MultipartFile[] files
  • 类型:Spring MVC提供的文件接收接口数组
  • 要求 :前端表单中文件字段名必须为 files
  • HTML对应代码
html 复制代码
<input type="file" name="files" multiple>
⑦ file.transferTo()
  • 作用:将上传的临时文件转移到目标路径
  • 等效操作
java 复制代码
// 手动实现文件保存
byte[] bytes = file.getBytes();
Path path = Paths.get("目标路径");
Files.write(path, bytes);
⑧+⑨ 路径拼接逻辑
  • 原始代码
java 复制代码
"A://OTHERS//..." + file.getOriginalFilename()
  • 示例结果
    若上传文件名为 homework.docx,则完整路径为:
    A://OTHERS//School//课程//财经//大三下//JavaEEhomework.docx
    (注意:路径缺少斜杠分隔符)

关键流程图示

客户端选择多个文件 POST /uploads Spring解析文件到MultipartFile数组 遍历数组 保存文件到磁盘 返回'success'


潜在问题说明

1. 路径错误
  • 问题代码"A://OTHERS..." + filename
  • 错误现象
    • 正确路径应为 A:/OTHERS/.../JavaEE/ + filename
    • 缺少目录分隔符导致路径错误(如生成 JavaEEhomework.docx
  • 修复建议
java 复制代码
// 添加路径分隔符
String basePath = "A:/OTHERS/School/课程/财经/大三下/JavaEE/";
String fullPath = basePath + file.getOriginalFilename();
2. 文件名安全
  • 风险 :若上传文件名为 ../../etc/passwd,可能覆盖系统文件
  • 验证示例
java 复制代码
file.getOriginalFilename() = "../../secret.txt"
// 最终路径:A:/.../JavaEE../../secret.txt
3. 异常处理缺失
  • 问题:任意文件保存失败会导致整个请求失败
  • 示例错误
plain 复制代码
java.io.IOException: The system cannot find the path specified

代码执行流程

  1. 接收请求
    客户端通过表单提交文件到 /uploads 路径:
html 复制代码
<form method="post" action="/uploads" enctype="multipart/form-data">
  <input type="file" name="files" multiple>
  <button>上传</button>
</form>
  1. Spring处理文件
    框架将上传的文件封装为 MultipartFile[] 数组
  2. 循环保存文件
    每个文件通过 transferTo() 保存到指定路径
  3. 返回结果
    无论成功与否,统一返回字符串 "success"

简单测试步骤

1. 创建测试HTML页
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. 启动应用并访问
bash 复制代码
mvn spring-boot:run

访问 http://localhost:8080

3. 选择文件上传
  • 选择任意文件(如 test.txt
  • 点击上传按钮
4. 验证结果
  • 控制台输出 success
  • 检查目录 A:\JavaEE 是否存在新文件
相关推荐
怒放吧德德4 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆6 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌8 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊9 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang10 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
用户83071968408210 小时前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Ray Liang11 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解11 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing15 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean15 小时前
Jackson View Extension Spring Boot Starter
java·后端