2012-10-20 6 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:Hochladen mehrerer Dateien mit Formdata()

var_dump($_FILES['fileToUpload']); 

Dies funktioniert, aber offensichtlich für die files[0] nur. Wie funktioniert das für ausgewählte Datei?

Ich habe versucht, die [0] zu entfernen, aber es hat nicht funktioniert.

Antwort

11

Sie müssen nur fileToUpload[] anstelle von fileToUpload:

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

Und es wird ein Array mit mehreren Namen, Größen zurückkehren, etc ...

42

Sie haben die Dateien Länge erhalten anhängen in JS und es dann wie unten

über AJAX Anfrage senden
//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

warum filetoupload []? – Phoenix

+0

Hat nicht für mich gearbeitet. Ich schätze, es hängt davon ab, wie Ihre mehrteilige Form serverseitig gehandhabt wird. – fubbe

+7

[Gemäß MDN 'Wie bei normalen Formulardaten können Sie mehrere Werte mit demselben Namen anhängen. Zum Beispiel (und kompatibel mit den Namenskonventionen von PHP durch Hinzufügen von [] zum Namen): '. Siehe Beispiel 3] (https://developer.mozilla.org/en-US/docs/Web/API/FormData/append) @Phoenix – 0xcaff

21

Die Art und Weise mit Javascript zu gehen:

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

Wenn Sie data.append ('Datei', Datei) mehrmals aufrufen, enthält Ihre Anfrage ein Array Ihrer Dateien.

Myself mit node.js und Multipart-Handler-Middleware multer die Daten erhalten, wie folgt:

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

'... Wenn Sie data.append ('Datei', Datei) mehrfach aufrufen mal wird deine Anfrage ein Array deiner Dateien enthalten ... 'rettete mir Stunden der Verzweiflung, vor allem weil ich dachte, der Name sollte' file [] 'sein, aber mit' file' und mehreren Anrufen funktionierte es, danke! – bourgeois247

+1

Kumpel du bist eine Legende, die seit dem Morgen suchen Dank allot Mann – Kannan

+1

Ich habe versucht, Sie Beispiel, aber wenn ich es var_dumped, es immer das letzte Bild des Satzes zurück. Ich habe geändert: 'data.append ('Datei', Datei)' zu 'data.append (' Datei ', i) ', das hat für mich funktioniert. –