当前位置: 首页 > news >正文

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


原始代码逐行解释

@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
    (注意:路径缺少斜杠分隔符)

关键流程图示

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

潜在问题说明

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

代码执行流程

  1. 接收请求
    客户端通过表单提交文件到 /uploads 路径:
<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页
<!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 是否存在新文件

相关文章:

  • 用自然语言指令构建机器学习可视化编程流程:InstructPipe 的创新探索
  • iTwin Tools函数拆解
  • Hiera:一款简洁的层次化视觉transformer
  • 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线
  • 楼宇自控怎样推动能源高效利用与建筑设备的科学管理
  • 【python】 循环语句(while)
  • 【Linux网络】应用层自定义协议与序列化
  • 10天学会嵌入式技术之51单片机-day-3
  • 文件的物理结构和逻辑结构的区分
  • 编译原理实验(四)———— LR(1)分析法
  • 《小型支付商城系统》学习记录
  • 【matlab】地图上的小图
  • 解决方案:远程shell连不上Ubuntu服务器
  • 阿里云人工智能大模型MCP协议
  • 薪技术|0到1学会性能测试第19课-参数化技术之导入数据
  • 正计数为倒计数(STC89C52单片机)
  • 实践项目开发-hbmV4V20250407-React+Taro多端项目依赖冲突解决方案
  • ESP8266_ESP32 Smartconfig一键配网功能
  • python全栈-flask
  • 【CUDA 】第5章 共享内存和常量内存——5.2 共享内存的数据分布(2)
  • 大卫·第艾维瑞谈历史学与社会理论②丨马克斯·韦伯与历史学研究
  • 泽连斯基:俄军违反停火承诺,20日10时起前线俄炮击增加
  • 以优良作风激发改革发展动力活力,中管企业扎实开展深入贯彻中央八项规定精神学习教育
  • 再现逆转!蒯曼击败伊藤美诚晋级澳门世界杯女单决赛
  • 习近平接受“柬埔寨王国民族独立大项链级勋章”
  • 江苏东海县多个商家直播带货玉石珠宝以假充真、虚假宣传被整治