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 是否存在新文件
相关推荐
程序员JerrySUN26 分钟前
[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
java·linux·架构
2302_8097983230 分钟前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
网安INF1 小时前
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
java·web安全·网络安全·flink·漏洞
一叶知秋哈1 小时前
Java应用Flink CDC监听MySQL数据变动内容输出到控制台
java·mysql·flink
jackson凌1 小时前
【Java学习笔记】SringBuffer类(重点)
java·笔记·学习
sclibingqing1 小时前
SpringBoot项目接口集中测试方法及实现
java·spring boot·后端
程序员JerrySUN1 小时前
全面理解 Linux 内核性能问题:分类、实战与调优策略
java·linux·运维·服务器·单片机
糯米导航1 小时前
Java毕业设计:办公自动化系统的设计与实现
java·开发语言·课程设计
糯米导航1 小时前
Java毕业设计:WML信息查询与后端信息发布系统开发
java·开发语言·课程设计
米粉03052 小时前
深入剖析Nginx:从入门到高并发架构实战
java·运维·nginx·架构