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 是否存在新文件
相关推荐
xbgRS10 小时前
springboot的自动装配
java·spring boot
嘻哈∠※17 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_79818 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25819 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅19 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息21 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒21 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
喜欢的名字被抢了21 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
数据知道1 天前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
2601_949950631 天前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐