formdata.append() 传 null、undefined 或空字符串时字段被静默跳过;需显式判断非空再添加,文件上传须用 file 对象并注意字段顺序与空值校验。

formData.append() 传空值或 null 时字段直接消失
调用 formData.append('name', value) 后后端收不到该字段,不是 bug,是规范行为:当 value 为 null、undefined 或空字符串 '' 时,浏览器会静默跳过该条目,不参与提交。
- 务必在 append 前做显式判断:
if (value != null && value !== '') formData.append('name', value) - 字符串建议统一处理:
String(value).trim(),避免空格导致误判为空 - 布尔值不能直接传:
formData.append('active', active)会发"true"或"false",多数后端不识别;应写成formData.append('active', active ? '1' : '0') - 日期推荐用
date.toISOString(),比date.toString()更稳定,避免时区和格式歧义
append 文件时必须用 File 对象,不能用 input.value 或路径字符串
input[type="file"] 的 value 是空字符串或文件名(不可靠),真正可用的是 input.files —— 它返回 FileList,需从中取 File 实例。
- 单文件:
const file = input.files[0]; if (file) formData.append('avatar', file) - 多文件必须遍历:
for (const file of input.files) formData.append('photos', file),否则直接formData.append('photos', input.files)会失败或上传乱码 - 若需自定义服务端接收的文件名,用第三个参数:
formData.append('report', file, '2024Q3.pdf')
混合上传时字段顺序影响后端解析,尤其 Express + multer
某些服务端解析器(如 multer)依赖 FormData 中字段的物理顺序来划分 multipart boundary 区段。如果先 append 普通字段再 append 文件,req.body 可能为空或字段丢失。
- 严格按「文件优先」顺序:
formData.append('avatar', file); formData.append('title', '用户头像'); - 普通字段若含对象或数组,必须先
JSON.stringify():formData.append('meta', JSON.stringify({ tags: ['a', 'b'] })) - fetch 发送时绝对不要手动设置
Content-Type,否则浏览器无法注入正确boundary,结果是后端收到乱码
append 和 set 混用同一 key 会导致字段覆盖或重复,调试时容易漏看
append('user_id', '123') 和 set('user_id', '456') 作用完全不同:前者追加,后者删除已有同名项再插入。但 console.log(formData) 不显示内部结构,容易误判。
- 调试真实内容用:
console.log([...formData.entries()]),输出形如[["user_id", "123"], ["user_id", "456"]] - 上传文件 + 表单字段混用场景,统一用
append(),避免set()意外清掉前面 append 的同名字段 - 明确只需单值的字段(如
token),可用set()防止重复添加,但前提是之前没用append()写过它
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











