2012-10-20 20 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:Przesyłanie wielu plików za formData()

var_dump($_FILES['fileToUpload']); 

To działa, ale oczywiście tylko dla files[0]. Jak uzyskać to działa dla wybranego pliku?

Próbowałem usunąć [0], ale to nie zadziałało.

Odpowiedz

11

Trzeba tylko użyć fileToUpload[] zamiast fileToUpload:

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

I zwróci tablicę z wielu nazw, rozmiarów, itp ...

42

Musisz uzyskać długość pliki do dołączania w JS, a następnie wysłać go za pośrednictwem żądania AJAX jak poniżej

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

dlaczego filetoupload []? – Phoenix

+0

Nie działa dla mnie. Wydaje mi się, że zależy to od tego, jak wielostronicowy formularz będzie obsługiwany przez serwer. – fubbe

+7

[Zgodnie z MDN 'Podobnie jak w przypadku zwykłych danych formularzy, można dołączyć wiele wartości o tej samej nazwie. Na przykład (i kompatybilność z konwencjami nazewnictwa PHP przez dodanie [] do nazwy): '. Zobacz Przykład 3] (https://developer.mozilla.org/en-US/docs/Web/API/FormData/append) @Phoenix – 0xcaff

21

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

Jeśli wielokrotnie wywołasz data.append ("plik", plik), twoja prośba będzie zawierać tablicę twoich plików.

Myself użyciu node.js i wieloczęściowy obsługi middleware multer uzyskać dane w następujący sposób:

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

'... Jeśli wywołasz plik data.append (" file ", file) multiple razy twoja prośba będzie zawierała tablicę twoich plików ... "Uratowałeś mi godziny rozpaczy, szczególnie, że czułem, że nazwa powinna brzmieć" plik [] ", ale używając tylko' file' i dzwoniąc wiele razy zadziałało, dziękuję! – bourgeois247

+1

Koleś, jesteś legendą, szukałeś tego od rana, dziękuję człowiekowi. – Kannan

+1

Próbowałem ci przykładu, ale kiedy go zmienię, zawsze zwraca ostatni obraz z zestawu. Zmieniłem: 'data.append ('file', file)' na 'data.append ('file', i)', które działało dla mnie. –

Powiązane problemy