在javascript中发送FormData中的FileList
Send FileList in FormData in javascrirpt
我正在尝试使用 FormData 发送一堆图像,但当然,我无法发送 FileList,而且我未能找到发送这些文件的方法。我已经尝试自己寻找答案,但大多数人建议附加每个文件。
for (let i = 0 ; i < images.length ; i++) {
formData.append("images[]", images[i]);
}
但它最终只包含 formData 中的最后一个文件,由于某种原因,先前的文件正在被下一个文件替换。
我也尝试过将 FileList 转换为数组,这可行,但我不知道如何分离这些文件,现在每个文件都作为一个字符串在一个键中。
0: "[{\"lastModified\":1606255989000,\"lastModifiedDate\":\"undefined\",\"name\":\"logo.png\",\"size\":54438,\"type\":\"image/png\"},{\"lastModified\":1606255979000,\"lastModifiedDate\":\"undefined\",\"name\":\"logo1.png\",\"size\":58023,\"type\":\"image/png\"},{\"lastModified\":1606252752000,\"lastModifiedDate\":\"undefined\",\"name\":\"logo2.png\",\"size\":28147,\"type\":\"image/png\"},{\"lastModified\":1606255121000,\"lastModifiedDate\":\"undefined\",\"name\":\"logo3.png\",\"size\":18260,\"type\":\"image/png\"}]"
我可以将它转换为字符串,然后使用 }
作为每个条目的末尾将其切割成自己的键。我不想这样做,即使我的经验很少,我也知道这不是一个好的方法。
截至目前,我的 javascript 代码如下所示。
File.prototype.toObject = function () {
return Object({
lastModified: parseInt(this.lastModified),
lastModifiedDate: String(this.lastModifiedDate),
name: String(this.name),
size: parseInt(this.size),
type: String(this.type)
})
}
FileList.prototype.toArray = function () {
return Array.from(this).map(function (file) {
return file.toObject()
})
}
let files = document.getElementById('files').files
let filesArray = files.toArray();
let formData = new FormData();
formData.append('images[]', JSON.stringify(filesArray));
然后我像这样发送这些数据
fetch('<?=env('app.baseURL')?>/admin/gallery', {
method: 'POST',
processData: false,
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
body: formData,
data: formData,
}).then(function (response) {...rest of the code...})
发送此数据后,接收没有任何问题我想保存这些文件,但我不能不先将它们分开。我在后端使用 PHP。
我对 javascript 没有太多经验,所以我可能遗漏了一些明显的东西,我们将不胜感激。
在 for 循环中,您可以为 formData 追加使用动态名称。例如:
formData.append(`image-${i}`, images[i])
或者,如果您想将图像推送到 formData 中的单个键值对,就像在您的示例中一样,您应该使用 getAll() 方法来检索图像。
formData.getAll('images[]')
这是遍历包含图像的数组的 PHP 代码:
<?php
if(isset($_FILES) && isset($_FILES['images'])){
$countfiles = count($_FILES['images']['name']);
for($i=0;$i<$countfiles;$i++){
$filename = $_FILES['images']['name'][$i];
$sql = "INSERT INTO myimages (filename) VALUES ('".$filename."')";
$db->query($sql);
move_uploaded_file($_FILES['images']['tmp_name'][$i],'upload/'.$filename);
}
}
?>
我正在尝试使用 FormData 发送一堆图像,但当然,我无法发送 FileList,而且我未能找到发送这些文件的方法。我已经尝试自己寻找答案,但大多数人建议附加每个文件。
for (let i = 0 ; i < images.length ; i++) {
formData.append("images[]", images[i]);
}
但它最终只包含 formData 中的最后一个文件,由于某种原因,先前的文件正在被下一个文件替换。
我也尝试过将 FileList 转换为数组,这可行,但我不知道如何分离这些文件,现在每个文件都作为一个字符串在一个键中。
0: "[{\"lastModified\":1606255989000,\"lastModifiedDate\":\"undefined\",\"name\":\"logo.png\",\"size\":54438,\"type\":\"image/png\"},{\"lastModified\":1606255979000,\"lastModifiedDate\":\"undefined\",\"name\":\"logo1.png\",\"size\":58023,\"type\":\"image/png\"},{\"lastModified\":1606252752000,\"lastModifiedDate\":\"undefined\",\"name\":\"logo2.png\",\"size\":28147,\"type\":\"image/png\"},{\"lastModified\":1606255121000,\"lastModifiedDate\":\"undefined\",\"name\":\"logo3.png\",\"size\":18260,\"type\":\"image/png\"}]"
我可以将它转换为字符串,然后使用 }
作为每个条目的末尾将其切割成自己的键。我不想这样做,即使我的经验很少,我也知道这不是一个好的方法。
截至目前,我的 javascript 代码如下所示。
File.prototype.toObject = function () {
return Object({
lastModified: parseInt(this.lastModified),
lastModifiedDate: String(this.lastModifiedDate),
name: String(this.name),
size: parseInt(this.size),
type: String(this.type)
})
}
FileList.prototype.toArray = function () {
return Array.from(this).map(function (file) {
return file.toObject()
})
}
let files = document.getElementById('files').files
let filesArray = files.toArray();
let formData = new FormData();
formData.append('images[]', JSON.stringify(filesArray));
然后我像这样发送这些数据
fetch('<?=env('app.baseURL')?>/admin/gallery', {
method: 'POST',
processData: false,
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
body: formData,
data: formData,
}).then(function (response) {...rest of the code...})
发送此数据后,接收没有任何问题我想保存这些文件,但我不能不先将它们分开。我在后端使用 PHP。
我对 javascript 没有太多经验,所以我可能遗漏了一些明显的东西,我们将不胜感激。
在 for 循环中,您可以为 formData 追加使用动态名称。例如:
formData.append(`image-${i}`, images[i])
或者,如果您想将图像推送到 formData 中的单个键值对,就像在您的示例中一样,您应该使用 getAll() 方法来检索图像。
formData.getAll('images[]')
这是遍历包含图像的数组的 PHP 代码:
<?php
if(isset($_FILES) && isset($_FILES['images'])){
$countfiles = count($_FILES['images']['name']);
for($i=0;$i<$countfiles;$i++){
$filename = $_FILES['images']['name'][$i];
$sql = "INSERT INTO myimages (filename) VALUES ('".$filename."')";
$db->query($sql);
move_uploaded_file($_FILES['images']['tmp_name'][$i],'upload/'.$filename);
}
}
?>