Heutzutage können wir Dateien per Drag & Drop in einen speziellen Container ziehen und mit XHR 2 hochladen. Viele gleichzeitig. Mit Live-Fortschrittsbalken usw. Sehr cooles Zeug. Beispiel hier.
Aber manchmal wollen wir nicht so viel Coolness. Ich möchte Dateien - viele gleichzeitig - per Drag & Drop in eine Standard-HTML-Dateieingabe ziehen : <input type=file multiple>
.
Ist das möglich? Gibt es eine Möglichkeit, die Dateieingabe mit den richtigen Dateinamen (?) Aus der Dateiablage zu füllen? (Aus Gründen der Dateisystemsicherheit sind keine vollständigen Dateipfade verfügbar.)
Warum? Weil ich ein normales Formular einreichen möchte. Für alle Browser und alle Geräte. Das Drag & Drop ist nur eine progressive Verbesserung, um UX zu verbessern und zu vereinfachen. Das Standardformular mit Standarddateieingabe (+ multiple
Attribut) wird dort sein. Ich möchte die HTML5-Erweiterung hinzufügen.
bearbeiten
weiß , dass ich in einigen Browsern , kann man manchmal (fast immer) selbst Dateien in das Dateieingabe fallen. Ich weiß, dass Chrome dies normalerweise tut, aber manchmal schlägt es fehl und lädt dann die Datei auf der aktuellen Seite (ein großer Fehler, wenn Sie ein Formular ausfüllen). Ich möchte es narrensicher machen.
quelle
input type="file" multiple
in SafariAntworten:
Folgendes funktioniert in Chrome und FF, aber ich habe noch keine Lösung gefunden, die auch IE10 + abdeckt:
Sie möchten wahrscheinlich
addEventListener
oder jQuery (usw.) verwenden, um Ihre evt-Handler zu registrieren - dies ist nur der Kürze halber.quelle
MSIE
,Trident/
(IE11) undEdge/
(IE12) ...fileInput.files = evt.dataTransfer.files;
. Safari und Chrome funktionieren jedoch beide einwandfrei.Ich habe eine Lösung dafür gefunden.
Code-Snippet anzeigen
Die Drag & Drop-Funktion für diese Methode funktioniert nur mit Chrome, Firefox und Safari. (Weiß nicht, ob es mit IE10 funktioniert), aber für andere Browser funktioniert die Schaltfläche "Oder hier klicken" einwandfrei.
Das Eingabefeld folgt einfach Ihrer Maus, wenn Sie eine Datei über einen Bereich ziehen, und ich habe auch eine Schaltfläche hinzugefügt.
Kommentarkommentar: 0; Die Dateieingabe ist nur sichtbar, sodass Sie sehen können, was los ist.
quelle
Dies ist die HTML5-Methode "DTHML". Eingabe in normaler Form (die nur gelesen werden kann, wie Ricardo Tomasi hervorhob). Wenn eine Datei eingezogen wird, wird sie an das Formular angehängt. Dies erfordert eine Änderung der Aktionsseite, um die auf diese Weise hochgeladene Datei zu akzeptieren.
Es ist noch besser, wenn Sie das gesamte Fenster zu einer Drop-Zone machen können. Siehe Wie erkenne ich ein HTML5-Drag-Ereignis, das wie Google Mail in das Fenster eintritt und es verlässt?
quelle
input type=file
.value
Eigenschaft jedes Mal, wenn Sie die Vorschleife durchlaufen, ständig mit der neuesten Datei?quelle
Theoretisch könnten Sie ein Element hinzufügen, das das überlagert
<input/>
, und dann dasdrop
Ereignis verwenden, um die Dateien (mithilfe der Datei-API) zu erfassen und an die Eingabe zu übergebenfiles
.Nur dass eine Dateieingabe schreibgeschützt ist . Das ist ein altes Problem.
Sie können das Formularsteuerelement jedoch vollständig umgehen und über XHR hochladen (nicht sicher, ob dies unterstützt wird):
Sie können auch ein Element in der Umgebung verwenden, um das Löschereignis in Chrome abzubrechen und das Standardverhalten beim Laden der Datei zu verhindern.
Das Löschen mehrerer Dateien über der Eingabe funktioniert bereits in Safari und Firefox.
quelle
Damit bin ich herausgekommen.
Verwenden von Jquery und HTML. Dadurch wird es zu den Einfügedateien hinzugefügt.
quelle
Für eine reine CSS-Lösung:
Geändert von https://codepen.io/Scribblerockerz/pen/qdWzJw
quelle
Ich weiß, dass einige Tricks in Chrome funktionieren:
Wenn Sie Dateien in die Ablagezone ablegen, erhalten Sie ein
dataTransfer.files
Objekt, dh einen Objekttyp, derFileList
alle von Ihnen gezogenen Dateien enthält. In der Zwischenzeit<input type="file" />
hat das Element die Eigenschaftfiles
, dass es sich um das gleicheFileList
Objekt handelt.Sie können das
dataTransfer.files
Objekt also einfach derinput.files
Eigenschaft zuweisen .quelle
input.files
nicht = (Für alle, die dies 2018 tun möchten, habe ich eine viel bessere und einfachere Lösung als all die alten Sachen, die hier veröffentlicht wurden. Sie können eine gut aussehende Drag & Drop-Box mit nur Vanille-HTML, JavaScript und CSS erstellen.
(Funktioniert bisher nur in Chrome)
Beginnen wir mit dem HTML.
Dann kommen wir zum Styling.
Nachdem Sie dies getan haben, sieht es bereits gut aus. Aber ich kann mir vorstellen, dass Sie sehen möchten, welche Datei Sie tatsächlich hochgeladen haben, also werden wir JavaScript erstellen. Erinnern Sie sich an diese pfp-Wertspanne? Dort drucken wir den Dateinamen aus.
Und das ist es.
quelle
Tolle Arbeit von @BjarkeCK. Ich habe einige Änderungen an seiner Arbeit vorgenommen, um sie als Methode in jquery zu verwenden:
Geige arbeiten
quelle
Einige Jahre später habe ich diese Bibliothek gebaut , um Dateien in ein beliebiges HTML-Element abzulegen.
Sie können es wie verwenden
quelle
Sie können eine Dateieingabe anzeigen und mit Ihrem transparenten Ablagebereich überlagern, wobei Sie darauf achten, einen Namen wie zu verwenden
file[1]
. {Stellen Sie sicher, dass sich dasenctype="multipart/form-data"
FORM-Tag in Ihrem FORM-Tag befindet.}Lassen Sie dann den Drop-Bereich die zusätzlichen Dateien verarbeiten, indem Sie dynamisch mehr Dateieingaben für Dateien 2..number_of_files erstellen. Stellen Sie sicher, dass Sie denselben Basisnamen verwenden und das value-Attribut entsprechend ausfüllen.
Zuletzt (Frontend) senden Sie das Formular.
Um diese Methode zu handhaben, müssen Sie lediglich Ihre Prozedur ändern, um ein Array von Dateien zu handhaben.
quelle
multiple
heutzutage ein Attribut. Es ist nicht mehr als 1 Dateieingabe erforderlich. Das ist jedoch nicht das Problem. Wie bekomme ich dieFile
Objekte in die Dateieingabe? Ich denke, dies erfordert ein Codebeispiel ...files
Eigenschaft) möglich, aber ich habe es im IE nicht geschafft - hatten Sie Glück?