Ich erstelle eine Webanwendung per Drag & Drop zum Hochladen mit HTML5, lege die Dateien auf einem div ab und rufe natürlich das dataTransfer-Objekt ab, das mir die FileList gibt .
Jetzt möchte ich einige der Dateien entfernen, aber ich weiß nicht wie oder ob es überhaupt möglich ist.
Am liebsten möchte ich sie einfach aus der Dateiliste löschen. Ich habe keine Verwendung für sie. Aber wenn das nicht möglich ist, sollte ich stattdessen Checks in Code schreiben, der mit der FileList interagiert? Das scheint umständlich.
javascript
html
drag-and-drop
filelist
Heilemann
quelle
quelle
Antworten:
Wenn Sie nur einige der ausgewählten Dateien löschen möchten, können Sie dies nicht. Der von Ihnen verlinkte Datei-API-Arbeitsentwurf enthält einen Hinweis:
Beim Lesen eines Teils des HTML 5-Arbeitsentwurfs stieß ich auf die Common-
input
Element-APIs . Anscheinend können Sie die gesamte Dateiliste löschen, indem Sie dievalue
Eigenschaft desinput
Objekts auf eine leere Zeichenfolge setzen, z.Übrigens könnte auch der Artikel Verwenden von Dateien aus Webanwendungen von Interesse sein.
quelle
length
ist schreibgeschützt, denke ich. Ich versuche ein Element mit Spleiß zu löschen, es schlägt in Chrome fehl.Diese Frage wurde bereits als beantwortet markiert, aber ich möchte einige Informationen weitergeben, die anderen bei der Verwendung von FileList helfen könnten.
Es wäre praktisch, eine Dateiliste als Array zu behandeln, aber Methoden wie Sortieren, Verschieben, Pop und Slice funktionieren nicht. Wie andere vorgeschlagen haben, können Sie die Dateiliste in ein Array kopieren. Anstatt eine Schleife zu verwenden, gibt es jedoch eine einfache einzeilige Lösung für diese Konvertierung.
In FF, Chrome und IE10 + OK getestet
quelle
Array.from(fileDialog.files)
ist einfacherfileDialog.files = fileBuffer
?Wenn Sie auf immergrüne Browser abzielen (Chrome, Firefox, Edge, funktioniert aber auch in Safari 9+) oder sich eine Polyfüllung leisten können, können Sie die Dateiliste
Array.from()
wie folgt in ein Array verwandeln :Dann ist es einfach, das Array von
File
s wie jedes andere Array zu handhaben .quelle
fileArray
nicht damit umzugehenfileList
.Da wir uns im HTML5-Bereich befinden, ist dies meine Lösung. Das Wesentliche ist, dass Sie die Dateien in ein Array verschieben, anstatt sie in einer Dateiliste zu belassen, und dann mit XHR2 die Dateien in ein FormData-Objekt verschieben. Beispiel unten.
quelle
Ich habe dafür eine sehr schnelle und kurze Problemumgehung gefunden. Getestet in vielen gängigen Browsern (Chrome, Firefox, Safari);
Zuerst müssen Sie FileList in ein Array konvertieren
Verwenden Sie dies, um das jeweilige Element zu löschen
quelle
event.target.files
die nicht mit der Eingabe verknüpft ist, sodass sie nichts außer Ihrer lokalen Variablen ändern kann.Ich weiß, dass dies eine alte Frage ist, aber sie hat in Bezug auf dieses Problem einen hohen Stellenwert bei Suchmaschinen.
Eigenschaften im FileList- Objekt können nicht gelöscht werden, aber zumindest in Firefox können sie geändert werden . Meine Problemumgehung bestand darin
IsValid=true
, den Dateien, die die Prüfung und bestanden haben , eine Eigenschaft hinzuzufügenIsValid=false
denen, die dies nicht getan haben .Dann durchlaufe ich einfach die Liste, um sicherzustellen, dass nur die Eigenschaften mit
IsValid=true
zu FormData hinzugefügt werden .quelle
Es gibt vielleicht einen eleganteren Weg, dies zu tun, aber hier ist meine Lösung. Mit Jquery
Grundsätzlich klemmen Sie den Wert der Eingabe. Klonen Sie es und setzen Sie den Klon anstelle des alten ein.
quelle
Dies ist vorübergehend, aber ich hatte das gleiche Problem, das ich auf diese Weise gelöst habe. In meinem Fall habe ich die Dateien über eine XMLHttp-Anforderung hochgeladen, sodass ich die geklonten FileList-Daten über angehängte Formulardaten veröffentlichen konnte. Die Funktionalität besteht darin, dass Sie mehrere Dateien so oft ziehen und ablegen oder auswählen können, wie Sie möchten (durch erneutes Auswählen von Dateien wird die geklonte Dateiliste nicht zurückgesetzt), jede gewünschte Datei aus der (geklonten) Dateiliste entfernt und über xmlhttprequest gesendet, was auch immer war dort gelassen. Das habe ich getan. Es ist mein erster Beitrag hier, daher ist der Code etwas chaotisch. Es tut uns leid. Ah, und ich musste jQuery anstelle von $ verwenden, wie es im Joomla-Skript war.
Nun das HTML und die Stile dafür. Ich bin ein ziemlicher Neuling, aber das alles hat tatsächlich für mich funktioniert und ich habe eine Weile gebraucht, um es herauszufinden.
Die Stile dafür. Ich musste einige von ihnen markieren! Wichtig, um das Verhalten von Joomla außer Kraft zu setzen.
Ich hoffe das hilft.
quelle
Danke @Nicholas Anderson einfach und direkt, hier ist Ihr Code angewendet und arbeitet mit jquery an meinem Code.
HTML.
JS CODE
quelle
In vue js:
quelle
Wenn Sie das Glück haben, eine Post-Anfrage mit den Dateien an die Datenbank zu senden, und Sie die Dateien haben, die Sie in Ihrem DOM senden möchten
Sie können einfach überprüfen, ob die Datei in der Dateiliste in Ihrem DOM vorhanden ist, und wenn dies nicht der Fall ist, senden Sie dieses Element natürlich nicht an de DB.
quelle
Möglicherweise möchten Sie ein Array erstellen und dieses anstelle der schreibgeschützten Dateiliste verwenden.
Führen Sie nach diesem Zeitpunkt das Hochladen anhand Ihrer Liste anstelle der integrierten Liste durch. Ich bin mir nicht sicher, in welchem Kontext Sie arbeiten, aber ich arbeite mit einem JQuery-Plugin, das ich gefunden habe, und ich musste die Quelle des Plugins nehmen und es mit auf die Seite setzen
<script>
Tags . Dann habe ich über der Quelle mein Array hinzugefügt, damit es als globale Variable fungieren kann und das Plugin darauf verweisen kann.Dann ging es nur noch darum, die Referenzen auszutauschen.
Ich denke, dies würde es Ihnen ermöglichen, Drag & Drop auch wieder hinzuzufügen. Wenn die integrierte Liste schreibgeschützt ist, wie könnten Sie dann die abgelegten Dateien in die Liste aufnehmen?
:))
quelle
FileList
Objekt dermyReadWriteList
Variablen , ändert es seinen Typ vonArray
nachFileList
, sodass dies keine Lösung ist.Ich ändere einfach die Art der Eingabe in den Text und zurück in die Datei: D.
quelle