2012-10-20 86 views
24
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],但它没有奏效。

回答

11

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

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

,它将返回有多个名称,大小等阵列...

42

你必须得到文件长度追加在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/>'; 
} 
+2

为什么filetoupload []? – Phoenix

+0

没有为我工作。我想这取决于你的多部分表单如何处理服务器端。 – fubbe

+7

[根据MDN'与常规表单数据一样,您可以附加多个具有相同名称的值。例如(并且通过将[]添加到名称来兼容PHP的命名约定):'。请参阅示例3](https://developer.mozilla.org/en-US/docs/Web/API/FormData/append)@Phoenix – 0xcaff

21

的方式去使用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),您的请求将包含文件数组。

我自己如何使用Node.js和多处理器中间件multer得到数据如下:

router.post('/trip/save', upload.array('file', 10), function(req, res){ 
    // Your array of files is in req.files 
} 
+1

'...如果您调用data.append('file',file)多个次您的请求将包含您的文件数组...'保存了我几个小时的绝望,尤其是因为我觉得名称应该是'file []',但只使用'file'并且多次调用都可以工作,谢谢! – bourgeois247

+1

老兄你是一个传奇已经从早上搜索这个感谢分配人 – Kannan

+1

我试过你的例子,但是当我var_dumped它时,它总是返回该集合的最后一个图像。我将data.append('file',file)'改为'data.append('file',i)',这对我很有用。 –