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 是否存在新文件
相关推荐
极客先躯12 分钟前
高级java每日一道面试题-2025年4月13日-微服务篇[Nacos篇]-Nacos如何处理网络分区情况下的服务可用性问题?
java·服务器·网络·微服务·nacos·高级面试
pwzs21 分钟前
Spring MVC 执行流程全解析:从请求到响应的七步走
java·后端·spring·spring mvc
我该如何取个名字1 小时前
Mac配置Java的环境变量
java·开发语言·macos
kkkkatoq1 小时前
Java中的锁
java·开发语言
界面开发小八哥1 小时前
「Java EE开发指南」用MyEclipse开发EJB 3无状态会话Bean(二)
java·ide·java-ee·eclipse·myeclipse
LCY1332 小时前
spring security +kotlin 实现oauth2.0 认证
java·spring·kotlin
soulermax2 小时前
数字ic后端设计从入门到精通2(含fusion compiler, tcl教学)
java·linux·服务器
我的代码永没有bug2 小时前
day1-小白学习JAVA---JDK安装和环境变量配置(mac版)
java·学习·macos
Johnny Lnex2 小时前
JVM之经典垃圾回收器
java