2012-10-20 19 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:yükleniyor birden fazla dosya()

var_dump($_FILES['fileToUpload']); 

Bu, ama belli sadece files[0] için çalışır. Bu seçilmiş dosya için nasıl çalışır?

Ben [0] çıkarmadan çalıştı, ancak işe yaramadı. Sen eklemek için dosyaların uzunluğu almak zorunda

cevap

11

sadece fileToUpload[] yerine fileToUpload kullanmak zorunda JS ve sonra javascript ile gitmek

//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/>'; 
} 
42

...

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

Ve vb birden isimler, boyutları, bir dizi döndürür:

+2

neden filetoupload []? – Phoenix

+0

Benim için çalışmadı. Çok parçalı formun sunucu taraflı nasıl ele alınacağına bağlı olduğunu düşünüyorum. – fubbe

+7

[MDN'ye göre Düzenli form verisinde olduğu gibi, aynı ada sahip birden çok değer ekleyebilirsiniz. Örneğin (ve adıyla [] ekleyerek PHP'nin adlandırma kuralları ile uyumlu olması): '. Örnek 3] (https://developer.mozilla.org/en-US/docs/Web/API/FormData/append) @Phoenix – 0xcaff

21

aşağıdaki gibi AJAX isteği üzerinden yol gönderin:

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); 
    } 
}) 

Eğer data.append ('dosyasını' dosyası) birden çok kez çağırırsanız isteğiniz dosyalarınızı bir dizi içerecektir.

Kendimi şöyle node.js ve çok parçalı işleyici katman multer veri almak kullanarak:

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

'... (dosya, 'dosya') data.append çağırırsanız birden bakın Zaman dosyalarınızı bir dizi içerecektir isteğiniz ... ', birden çok kez sadece 'dosya' kullanarak ve arama sayesinde çalışmış ben' isim '[] bulunmalısınız keçe, özellikle çünkü bana umutsuzluk saat kaydedilmiştir ancak! – bourgeois247

+1

Dostum sen bir efsane sabah sayesinde bu ararken ettiğin adam Sana örnek çalıştı – Kannan

+1

tahsis vardır, ama bunu var_dumped zaman, her zaman setin son resmi döndürülür. Ben değiştirdim: data.append ('dosya', dosya) '' 'data.append ('dosya', i)', benim için çalıştı. –