我正在尝试访问multipart-form-data
请求中的数组。
在我的js代码中,我将以这种方式需要的对象添加到formData中:
for (const key in property) {
if (typeof property[key] !== 'undefined') {
console.log(key, property[key]);
formData.append(`property[${key}]`, property[key]);
}
}
该属性具有数组图像,值是如下所示的数组:
同样在同一个forData中,我发送了我想要处理的图像中的所有数据,在本例中,该属性包含一个对象数组,这些对象是以前存储在数据库中的图像。因此,在我的控制器中,我必须遵循
// Images that are already in database
$propertyData = $request->input('property');
$images = isset($propertyData['images'])? $propertyData['images'] : []
foreach($images as $i) {
$image = Image::find((int)$i['id']);
if ( !is_null($image) ) {
$image->update($i);
}
}
但是我得到了错误:Invalid argument supplied for foreach()
我甚至尝试过将javascript代码中的每个图像转换为一个类似于属性的数组,但我得到了相同的错误。
发布于 2018-10-19 07:19:54
不能直接将对象或数组附加到FormData
。必须逐个添加键和值。
这样做的一种方法是:
var formData = new FormData;
var arr = ['this', 'is', 'an', 'array'];
for (var i = 0; i < arr.length; i++) {
formData.append('arr[]', arr[i]);
}
我使用助手函数(请注意,这是在ES6语法中)来完成此操作:
export function appendFormdata(formData, data, previousKey) {
if (data instanceof Object) {
Object.keys(data).forEach(key => {
const value = data[key];
if (previousKey) {
key = `${previousKey}[${key}]`;
}
if (value instanceof Object && !Array.isArray(value) && !(value instanceof File)) {
return appendFormdata(formData, value, key);
}
if (Array.isArray(value)) {
value.forEach((val, i) => {
return appendFormdata(formData, val, `${key}[${i}]`);
});
} else {
formData.append(key, value);
}
});
}
}
有关更多细节,请参阅:appending array to FormData and send via AJAX和Convert JS Object to form data
https://stackoverflow.com/questions/52883608
复制相似问题