使用 formData() 上传多个文件

IT技术 javascript arrays upload xmlhttprequest
2021-01-26 10:22:48
var fd = new FormData();
fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
var xhr = new XMLHttpRequest();
xhr.open("POST", "uph.php");
xhr.send(fd);

uph.php:

var_dump($_FILES['fileToUpload']);

这有效,但显然是files[0]唯一的。如何使它适用于所选文件?

我尝试删除[0],但没有用。

6个回答

您必须获取要附加到 JS 中的文件长度,然后通过 AJAX 请求发送它,如下所示

//JavaScript 
var ins = document.getElementById('fileToUpload').files.length;
for (var x = 0; x < ins; x++) {
    fd.append("fileToUpload[]", document.getElementById('fileToUpload').files[x]);
}

//PHP
$count = count($_FILES['fileToUpload']['name']);
for ($i = 0; $i < $count; $i++) {
    echo 'Name: '.$_FILES['fileToUpload']['name'][$i].'<br/>';
}
@HoussemBadri 在我的情况下fileToUpload不起作用。它应该fileToUpload[]如答案中所建议的那样。你的评论让我花了一个小时才知道发生了什么。
2021-03-27 10:22:48
没有为我工作。我想这取决于您的多部分表单将如何处理服务器端。
2021-04-01 10:22:48
fileToUpload[] 错了,应该是 fileToUpload
2021-04-06 10:22:48
只返回一个文件
2021-04-09 10:22:48

使用javascript的方法:

var data = new FormData();

$.each($("input[type='file']")[0].files, function(i, file) {
    data.append('file', file);
});

$.ajax({
    type: 'POST',
    url: '/your/url',
    cache: false,
    contentType: false,
    processData: false,
    data : data,
    success: function(result){
        console.log(result);
    },
    error: function(err){
        console.log(err);
    }
})

如果您多次调用 data.append('file', file) ,您的请求将包含一个文件数组。

来自 MDN 网络文档

“的append()所述的方法FormData接口追加一个新的值到内部现有的密钥FormData对象时,或者,如果它不存在添加的关键。之间的差值FormData.seT和append()是,如果指定的键已经存在,FormData.set覆盖与所有现有值新的,而append()将新值附加到现有值集的末尾。”

我自己使用 node.js 和 multipart 处理程序中间件 multer 获取数据如下:

router.post('/trip/save', upload.array('file', 10), function(req, res){
    // Your array of files is in req.files
}
伙计,你是一个传奇,从早上开始就一直在寻找这个,谢谢分配人
2021-03-12 10:22:48
这一行是最重要的信息,非常If you call data.append('file', file) multiple times your request will contain an array of your files.感谢。节省了我几个小时的时间。
2021-03-15 10:22:48
我试过你的例子,但是当我 var_dumped 它时,它总是返回集合的最后一个图像。我改变了:data.append('file', file)to data.append('file', i),这对我有用。
2021-03-29 10:22:48
...If you call data.append('file', file) multiple times your request will contain an array of your files...节省了我几个小时的绝望,特别是因为我觉得这个名字应该是file[],但是file多次使用 just和调用是可行的,谢谢!
2021-04-02 10:22:48
你是我的英雄
2021-04-02 10:22:48

你只需要使用fileToUpload[]而不是fileToUpload

fd.append("fileToUpload[]", document.getElementById('fileToUpload').files[0]);

它将返回一个具有多个名称、大小等的数组...

这需要循环,并附加每个files[i]
2021-03-30 10:22:48

这对我有用:

let formData = new FormData()
formData.append('files', file1)
formData.append('files', file2)
文件必须循环追加。
2021-03-27 10:22:48

这个对我有用

//Javascript part
//file_input is a file input id
var formData = new FormData();
var filesLength=document.getElementById('file_input').files.length;
for(var i=0;i<filesLength;i++){
	formData.append("file[]", document.getElementById('file_input').files[i]);
}
$.ajax({
   url: 'upload.php',
   type: 'POST',
   data: formData,
   contentType: false,
   cache: false,
   processData: false,
   success: function (html) {
   
  }
});

<?php
//PHP part
$file_names = $_FILES["file"]["name"];
for ($i = 0; $i < count($file_names); $i++) {
   $file_name=$file_names[$i];
   $extension = end(explode(".", $file_name));
   $original_file_name = pathinfo($file_name, PATHINFO_FILENAME);
   $file_url = $original_file_name . "-" . date("YmdHis") . "." . $extension;
 move_uploaded_file($_FILES["file"]["tmp_name"][$i], $absolute_destination . $file_url);
}