Ich habe eine Seite, die mehrere Eingänge für das Hochladen einzelner Dateien hat. Art wie folgt aus:Wie verwende ich FileReader.onload mehrmals auf einer Seite?
<div id="fileUpload1">
<input id="inputField1" type="file"></input>
</div>
<div id="fileUpload2">
<input id="inputField2" type="file"></input>
</div>
<div id="fileUpload3">
<input id="inputField3" type="file"></input>
</div>
<button type="button" onclick="uploadFiles()">Upload</button>
Innen uploadFiles(), habe ich zunächst eine Reihe von jeder Datei in die Eingabefelder erstellen:
var files = [];
for (var i = 1; i <= 3; i++) {
var element = document.getElementById("inputField" + i);
var file = element.files[0];
files.push(file);
}
Dann versuche ich, Filereader die onLoad Ereignis für jede Datei in der rufen "files" -Array:
for (var i = 0, f; f= files[i]; i++) {
var fileName = f.name;
console.log("out: " + fileName);
var reader = new FileReader();
reader.onload = function (e) {
console.log("in: " + fileName);
addItem(e.target.result, fileName);
}
reader.readAsArrayBuffer(f);
}
addItem() ist eine Funktion, die funktioniert.
Wenn ich dies, nur das letzte Element in der "Dateien" -Array ist hochgeladen.
Wenn inputField1 eine Datei namens file1.jpg hat, hat inputField2 eine Datei namens file2.jpg, etc, würde ich folgendes in der Konsole:
out: file1.jpg
out: file2.jpg
out: file3.jpg
in: file3.jpg
in: file3.jpg
in: file3.jpg
Ich fühle mich wie ich etwas wirklich grundlegende bin fehlt mit der Verwendung von FileReader. Jede Hilfe wäre willkommen. Vielen Dank!
Vielen Dank! Aber warum funktioniert das? Führt "new FileReader()" in der for-Schleife keine neue Instanz erstellen? – happyshohaku
Es ist Verschluss. Beim letzten Mal habe ich uploadFiles, i = files.length, ausgeführt. Wenn also der Code innerhalb von reader.onload ausgeführt wird, erhält er immer die letzte Datei. – echo
Es scheint, dass das Problem mit dem "var fileName = f.name;" außerhalb des Onloads sein. Ich denke, das e.target.result wäre im ursprünglichen Beispiel korrekt gewesen. Die Ausgabe wäre auch von der Ausführungsreihenfolge der Dinge abhängig. Wenn der Browser jedes onload direkt nach readAsArrayBuffer aufgerufen hat, wäre das out: richtig, aber es sieht so aus, als ob Ihr Fall die Schleife alle 3 mal ausgeführt hätte und dann alle Onloads aufgerufen hätte. –
proteantech