如何将不同类型的表单输入附加到 formData()?
Posted
技术标签:
【中文标题】如何将不同类型的表单输入附加到 formData()?【英文标题】:How to append different types of form inputs to formData()? 【发布时间】:2021-09-28 21:48:37 【问题描述】:我的表单包含多种输入类型(file
、number
、text
等),而一些文件输入有 multiple
attribute
,而有些则没有。所以问题是如何将所有这些不同的类型附加到 formData()
而无需逐个附加每个输入?实际上,我正在考虑将它与我的所有表单一起使用的功能。
【问题讨论】:
Mozilla 文档说你可以将表单传递给FormData
构造函数developer.mozilla.org/en-US/docs/Web/API/FormData/FormData 即new FormData(document.querySelector('#myForm'))
,它会解析表单中的所有输入
【参考方案1】:
这是一个适用于所有类型输入类型(文件 [单个和多个]、文本、数字等)的解决方案:
formData
是包含我们表单数据的对象。例如我稍后填充数据的空对象:
formData :
first_name: null,
last_name: null,
image: null,
thumbnails: [],
let formData = new FormData()
for(let key in this.formData)
if(typeof(this.formData[key]) === 'object')
if(this.formData[key].length)
for (let subKey in this.formData[key])
formData.append(`$key[]`, this.formData[key][subKey]);
else
formData.append(key, this.formData[key]);
else
formData.append(key, this.formData[key]);
this.$axios.$post(url, formData,
headers:
'Content-Type': 'application/x-www-form-urlencoded'
).then((response) =>
// ...
).catch((error) =>
// ...
)
【讨论】:
【参考方案2】:一个简单的例子
// data: a:1,b:'2',c:[1,2,'3'],d: a:1, b:3, files:[]
// data will be converted to FormData
const toFormData = data =>
if (data instanceof FormData) return data
const fd = new FormData()
data &&
Object.keys(data).forEach(key =>
const val = data[key]
switch (typeof val)
case 'string':
val && fd.append(key, val)
break
case 'number':
;(val || val === 0) && fd.append(key, val)
break
case 'boolean':
fd.append(key, val)
break
case 'object':
if (IsArray(val))
val.length &&
(typeof val[0] === 'object'
? fd.append(key, JSON.stringify(val))
: fd.append(key, val))
else if (val instanceof File)
fd.append(key, val)
else if (val !== null)
fd.append(key, JSON.stringify(val))
break
)
return fd
【讨论】:
以上是关于如何将不同类型的表单输入附加到 formData()?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 $.each 将多个文件输入附加到 FormData 对象?
ASP.net core MVC Framework 5 Formdata在附加图像时类型不正确