fetch 不支持直接发送嵌套 formdata,需前端手动序列化为 json 字符串或用命名约定模拟层级,文件字段必须单独 append,禁止直接 append 对象或数组。

Fetch 本身不支持直接发送嵌套的 FormData 数据,因为 FormData 是键值对结构,天然扁平化,无法原生表达对象或数组的嵌套关系。要实现“嵌套效果”,需在前端手动序列化(如转成 JSON 字符串),或在后端约定解析规则;不能依赖浏览器自动展开嵌套对象。
用 JSON 字符串模拟嵌套结构
将嵌套数据先 JSON.stringify(),再作为普通字段 append 到 FormData 中。这是最常用、兼容性最好的方式。
- 前端构造示例:
const formData = new FormData();
const user = { name: "Alice", address: { city: "Beijing", zip: "100000" } };
formData.append("user", JSON.stringify(user));
fetch("/api/submit", { method: "POST", body: formData }); - 后端需主动解析该字段(如 Node.js 的
JSON.parse(req.body.user)) - 注意:文件字段不能放在 JSON 内,必须单独 append,例如:
formData.append("avatar", fileInput.files[0])
用命名约定模拟层级(适用于简单嵌套)
通过字段名加点号或方括号(如 user.name、items[0].price)传递结构信息,后端按规则解析。这种方式无需 JSON 序列化,但依赖服务端支持。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 示例:
formData.append("user.name", "Alice");
formData.append("user.address.city", "Beijing");
formData.append("items[0].title", "Book");
formData.append("items[0].price", "29.99"); - 适合 PHP(原生支持)、Express 配合
qs或body-parser中间件解析 - 纯 Node.js 或其他语言需自行实现解析逻辑,不推荐复杂嵌套
避免常见错误
直接把对象或数组 append 进 FormData 不会报错,但实际只存字符串 [object Object] 或 1,2,3,丢失结构。
- ❌ 错误写法:
formData.append("data", { a: 1, b: { c: 2 } }); - ❌ 错误写法:
formData.append("list", [1, 2, 3]); - ✅ 正确做法:始终显式序列化或拆解为扁平字段
- 调试时可用
for (let [k,v] of formData) console.log(k, v)查看真实提交内容
需要上传文件时的注意事项
混合表单(含文本+文件)必须用 FormData,且所有嵌套文本字段仍需按上述方式处理;不能把整个对象转成 JSON 后和文件一起塞进一个字段。
- 正确组合:
formData.append("metadata", JSON.stringify({ type: "report", tags: ["a","b"] }));
formData.append("file", fileInput.files[0]); - 不要尝试:
formData.append("all", JSON.stringify({ metadata: ..., file: ... }))—— 文件无法被 JSON 包裹 - 后端需分别接收
metadata(解析 JSON)和file(处理二进制流)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










