问题描述
我有一个嵌套对象,其中一些值是对象数组。这些对象有一个字段作为文件。这是对象结构。
{
"shop_name":"Organic Farm Shop","shop_logo": File,"description":"Lorem ipsum dolor sit amet consectetur adipisicing elit. ","category":"Grocery","shop_url":"organic-farm","product_details":[
{
"product_name":"Fresh Carrots","product_image": File,"price":45,"stock":10,"unit":"Kg","catogoryName":"Frozen Foodss"
},{
"product_name":"Fresh Cucumbers","price":80,"stock":20,"catogoryName":"Frozen Foodss"
}
],"page_input":[
{
"inputLabel":"Address","inputType":"multiline_text"
},{
"inputLabel":"Mobile Number","inputType":"numbers"
}
]
}
如何将其附加到 FormData?或者有没有更好的方法可以在不使用 FormData 的情况下做到这一点?
解决方法
你应该先把它字符串化:
var expressiveObjectVariableName = JSON.stringify(expressiveObjectName);
然后通常追加它。
form.append('expressiveFieldName',expressiveObjectVariableName );
编辑:
对于嵌套对象、数组和文件,描述的问题,试试这个:
JavaScript 版本
function toFormData(obj,form,namespace) {
let fd = form || new FormData();
let formKey;
for(let property in obj) {
if(obj.hasOwnProperty(property) && obj[property]) {
if (namespace) {
formKey = namespace + '[' + property + ']';
} else {
formKey = property;
}
// if the property is an object,but not a File,use recursivity.
if (obj[property] instanceof Date) {
fd.append(formKey,obj[property].toISOString());
}
else if (typeof obj[property] === 'object' && !(obj[property] instanceof File)) {
toFormData(obj[property],fd,formKey);
} else { // if it's a string or a File object
fd.append(formKey,obj[property]);
}
}
}
return fd;
}
TypeScript 版本
function createFormData(object: Object,form?: FormData,namespace?: string): FormData {
const formData = form || new FormData();
for (let property in object) {
if (!object.hasOwnProperty(property) || !object[property]) {
continue;
}
const formKey = namespace ? `${namespace}[${property}]` : property;
if (object[property] instanceof Date) {
formData.append(formKey,object[property].toISOString());
} else if (typeof object[property] === 'object' && !(object[property] instanceof File)) {
createFormData(object[property],formData,formKey);
} else {
formData.append(formKey,object[property]);
}
}
return formData;
}