我正在使用FormData上传文件。我还想发送一系列其他数据。
当我发送图像时,它工作正常。当我将一些文本附加到formdata时,它工作正常。当我尝试在下面附加'tags'数组时,其他一切工作正常但没有发送数组。
FormData和附加数组的任何已知问题?
实例化formData:
formdata = new FormData();
我创建的数组。 Console.log显示一切正常。
// Get the tags
tags = new Array();
$('.tag-form').each(function(i){
article = $(this).find('input[name="article"]').val();
gender = $(this).find('input[name="gender"]').val();
brand = $(this).find('input[name="brand"]').val();
this_tag = new Array();
this_tag.article = article;
this_tag.gender = gender;
this_tag.brand = brand;
tags.push(this_tag);
console.log('This is tags array: ');
console.log(tags);
});
formdata.append('tags', tags);
console.log('This is formdata: ');
console.log(formdata);
我如何发送:
// Send to server
$.ajax({
url: "../../build/ajaxes/upload-photo.php",
type: "POST",
data: formdata,
processData: false,
contentType: false,
success: function (response) {
console.log(response);
$.fancybox.close();
}
});
答案 0 :(得分:27)
这个怎么样?
formdata.append('tags', JSON.stringify(tags));
...相应地,在服务器上使用json_decode
来解析它。请参阅,FormData.append的第二个值可以是......
Blob,File或字符串,如果两者都不是,则将值转换为a 串
我看到它的方式,你的tags
数组包含对象(@Musa是对的,顺便说一句;使this_tag
成为一个数组,然后为它指定字符串属性没有意义;改用普通对象) ,所以原生转换(toString()
)是不够的。不过,JSON'ing应该可以获得信息。
作为旁注,我会重写属性分配块:
tags.push({article: article, gender: gender, brand: brand});
答案 1 :(得分:12)
写作
var formData = new FormData;
var array = ['1', '2'];
for (var i = 0; i < array.length; i++) {
formData.append('array_php_side[]', array[i]);
}
你可以通过php接收正常的数组post / get。
答案 2 :(得分:11)
使用"xxx[]"
作为formdata中字段的名称(在这种情况下,您将获得一个字符串化对象数组)
所以在你的循环中
$('.tag-form').each(function(i){
article = $(this).find('input[name="article"]').val();
gender = $(this).find('input[name="gender"]').val();
brand = $(this).find('input[name="brand"]').val();
this_tag = new Array();
this_tag.article = article;
this_tag.gender = gender;
this_tag.brand = brand;
//tags.push(this_tag);
formdata.append('tags[]', this_tag);
...
答案 3 :(得分:3)
功能:
function appendArray(form_data, values, name){
if(!values && name)
form_data.append(name, '');
else{
if(typeof values == 'object'){
for(key in values){
if(typeof values[key] == 'object')
appendArray(form_data, values[key], name + '[' + key + ']');
else
form_data.append(name + '[' + key + ']', values[key]);
}
}else
form_data.append(name, values);
}
return form_data;
}
使用:
var form = document.createElement('form');// or document.getElementById('my_form_id');
var formdata = new FormData(form);
appendArray(formdata, {
'sefgusyg': {
'sujyfgsujyfsg': 'srkisgfisfsgsrg'
}, test1: 5, test2: 6, test3: 8, test4: 3, test5: [
'sejyfgjy',
'isdyfgusygf'
]
});
答案 4 :(得分:1)
var formData = new FormData; var arr = ['item1', 'item2', 'item3'];
arr.forEach(item => {
formData.append(
"myFile",item
); });
答案 5 :(得分:1)
我们可以简单地这样做。
formData = new FormData;
words = ["apple", "ball", "cat"]
words.forEach((item) => formData.append("words[]", item))
// verify the data
console.log(formData.getAll("words[]"))
//["apple", "ball", "cat"]
在服务器端,您将获得words = ["apple", "ball", "cat"]
答案 6 :(得分:1)
我是这样做的:
const data = new FormData();
data.append('id', class.id);
data.append('name', class.name);
class.people.forEach((person, index) => {
data.append(`people[${index}].id`, person.id);
data.append(`people[${index}].firstname`, person.firstname);
data.append(`people[${index}].lastname`, person.lastname);
// Append images
person.images.forEach((image, imageIndex) =>
data.append(`people[${index}].images`, {
name: 'image' + imageIndex,
type: 'image/jpeg',
uri: image,
})
);
});
我在前端使用 React,后端使用 Asp.Net。
答案 7 :(得分:0)
var formData = new FormData;
var alphaArray = ['A', 'B', 'C','D','E'];
for (var i = 0; i < alphaArray.length; i++) {
formData.append('listOfAlphabet', alphaArray [i]);
}
并且在您的请求中,您将获得字母数组。
答案 8 :(得分:0)
您只能对数组进行字符串化并追加。将数组作为实际数组发送,即使它只有一项。
const array = [ 1, 2 ];
let formData = new FormData();
formData.append("numbers", JSON.stringify(array));
答案 9 :(得分:0)
当我发送文件+文本+数组时,这对我有用:
const uploadData = new FormData();
if (isArray(value)) {
const k = `${key}[]`;
uploadData.append(k, value);
} else {
uploadData.append(key, value);
}
const headers = {
'Content-Type': 'multipart/form-data',
};
答案 10 :(得分:0)
您可以这样做:
var formData = new FormData();
formData.append('array[key1]', this.array.key1);
formData.append('array[key2]', this.array.key2);
答案 11 :(得分:0)
我正在vuejs中使用formData发送文件(数组)
对我来说,下面的代码可以正常工作
if(this.requiredDocumentForUploads.length > 0) {
this.requiredDocumentForUploads.forEach(file => {
var name = file.attachment_type // attachment_type is using for naming
if(document.querySelector("[name=" + name + "]").files.length > 0) {
formData.append("requiredDocumentForUploadsNew[" + name + "]", document.querySelector("[name=" + name + "]").files[0])
}
})
}