2012-10-20 35 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:tải lên nhiều file sử dụng formData()

var_dump($_FILES['fileToUpload']); 

này hoạt động, nhưng rõ ràng cho chỉ files[0]. Làm thế nào để có được điều này làm việc cho tập tin được lựa chọn?

Tôi đã thử xóa [0] nhưng không hoạt động.

Trả lời

11

Bạn chỉ cần sử dụng fileToUpload[] thay vì fileToUpload:

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

Và nó sẽ trả về một mảng với nhiều tên, kích thước, vv ...

42

Bạn có để có được độ dài file để nối thêm trong JS và sau đó gửi nó qua yêu cầu AJAX như sau

//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

tại sao filetoupload []? – Phoenix

+0

Không làm việc cho tôi. Tôi đoán nó phụ thuộc vào cách hình thức multipart của bạn sẽ xử lý máy chủ mặt. – fubbe

+7

[Theo MDN 'Như với dữ liệu biểu mẫu thông thường, bạn có thể nối nhiều giá trị có cùng tên. Ví dụ (và tương thích với các quy ước đặt tên của PHP bằng cách thêm [] vào tên): '. Xem Ví dụ 3] (https://developer.mozilla.org/en-US/docs/Web/API/FormData/append) @Phoenix – 0xcaff

21

cách để đi với 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); 
    } 
}) 

Nếu bạn gọi data.append ('tệp', tệp) nhiều lần yêu cầu của bạn sẽ chứa một mảng tệp của bạn.

Myself sử dụng Node.js và nhiều phần dữ liệu xử lý middleware multer lấy dữ liệu như sau:

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

'... Nếu bạn gọi data.append ('tệp', tệp) nhiều thời gian yêu cầu của bạn sẽ chứa một mảng các tập tin của bạn ... 'Đã lưu tôi giờ tuyệt vọng, đặc biệt là vì tôi cảm thấy tên nên là' file [] ', nhưng chỉ sử dụng' file' và gọi nhiều lần, cảm ơn! – bourgeois247

+1

Dude bạn là một huyền thoại đã được tìm kiếm này từ sáng nhờ người đàn ông allot – Kannan

+1

Tôi đã thử bạn ví dụ, nhưng khi tôi var_dumped nó, nó luôn luôn trở lại hình ảnh cuối cùng của bộ này. Tôi đã thay đổi: 'data.append ('file', file)' thành 'data.append ('file', i)', đã làm việc cho tôi. –

Các vấn đề liên quan