Ermitteln von Ordnern / Verzeichnissen in JavaScript-FileList-Objekten

8

Ich habe kürzlich einen Code zu Moodle beigetragen, der einige der Möglichkeiten von HTML5 nutzt, um das Hochladen von Dateien in Formulare per Drag & Drop vom Desktop zu ermöglichen (der Kern des Codes ist hier: Ссылка zur Referenz).

Dies funktioniert gut, außer wenn ein Benutzer anstelle einer echten Datei einen Ordner / Verzeichnis zieht. Garbage wird dann auf den Server hochgeladen, aber der Dateiname entspricht dem Ordner.

Was ich suche, ist eine einfache und zuverlässige Möglichkeit, das Vorhandensein eines Ordners im Objekt FileList zu erkennen überspringe es (und gebe wahrscheinlich auch eine freundliche Fehlermeldung zurück).

Ich habe die MDN-Dokumentation sowie eine allgemeinere Websuche durchgesehen, aber nichts gefunden. Ich habe mir auch die Daten in den Chrome-Entwicklertools angesehen und es scheint, dass der Typ des Dateiobjekts konsistent auf " für Ordner festgelegt ist. Ich bin jedoch nicht ganz davon überzeugt, dass dies die zuverlässigste, browserübergreifende Erkennungsmethode ist.

Hat jemand bessere Vorschläge?

    
davosmith 13.01.2012, 20:09
quelle

5 Antworten

17

Sie können sich nicht auf file.type verlassen. Eine Datei ohne Erweiterung hat den Typ "" . Speichern Sie eine Textdatei mit der Erweiterung .jpg , und laden Sie sie in ein Dateisteuerelement. Der Typ wird als image/jpeg angezeigt. Und ein Ordner mit dem Namen "someFolder.jpg" wird auch seinen Typ als image/jpeg haben.

Versuchen Sie, die Datei mit FileReader zu lesen. Wenn ein Verzeichnis hineingezogen wird, wird FileReader das Ereignis error auslösen:

%Vor%

Glücklicherweise, in IE11, wenn ein Verzeichnis gelöscht wird, ist die e.dataTransfer.files Sammlung leer.

Chrome stellt eine zusätzliche Eigenschaft in e.dataTransfer namens items mit einer Sammlung von DataTransferItem -Objekten zur Verfügung. Sie können für jedes dieser Objekte item.webkitGetAsEntry() aufrufen, wodurch ein Objekt Entry zurückgegeben wird. Das Objekt Entry hat die Eigenschaften isDirectory und isFile :

%Vor%

Interessanterweise hatte jeder Ordner, den ich mir angesehen habe, in seinem Experiment File.size % 4096 als Null. Natürlich haben einige Dateien das auch. File.size ist kein zuverlässiger Indikator dafür, ob eine Datei tatsächlich ein Ordner ist.

    
gilly3 13.01.2012, 21:24
quelle
6

Ich bin auch auf dieses Problem gestoßen und unten ist meine Lösung. Grundsätzlich hatte ich einen zweigleisigen Ansatz:

(1) Überprüfen Sie, ob die Größe des Dateiobjekts groß ist, und betrachten Sie es als eine echte Datei, wenn sie über 1 MB groß ist (ich nehme an, dass die Ordner selbst nie so groß sind). (2) Wenn das File-Objekt kleiner als 1 MB ist, lese ich es mit der 'readAsArrayBuffer'-Methode von FileReader. Erfolgreiche Lesevorgänge rufen 'onload' auf und ich glaube, dass dies darauf hinweist, dass das Dateiobjekt eine echte Datei ist. Fehlgeschlagene Leseaufrufe 'onerror' und ich betrachte es als ein Verzeichnis. Hier ist der Code:

%Vor%

Ich habe dies in FF 26, Chrome 31 und Safari 6 getestet und drei Browser rufen 'onerror' auf, wenn sie versuchen, Verzeichnisse zu lesen. Lassen Sie mich wissen, wenn jemand an einen Anwendungsfall denken kann, bei dem dies nicht funktioniert.

    
Nick G. 02.01.2014 01:00
quelle
2

Ich schlage vor, FileReader.readAsBinaryString für das Objekt File aufzurufen. In Firefox wird dies zu einer Ausnahme führen, wenn File ein Directory ist. Ich tue das nur, wenn File die von gilly3 vorgeschlagenen Bedingungen erfüllt.

Bitte lesen Sie meinen Blog-Beitrag unter Ссылка für mehr Details.

Auch Version 21 von Google Chrome unterstützt nun das Löschen von Ordnern. Sie können leicht überprüfen, ob die gelöschten Objekte Ordner sind, und auch deren Inhalt lesen.

Leider habe ich keine (clientseitige) Lösung für ältere Chrome-Versionen.

    
Richie 13.08.2012 11:57
quelle
0

Eine andere Anmerkung ist, dass der Typ "" für jede Datei mit einer unbekannten Erweiterung ist. Versuchen Sie, eine Datei namens test.blah hochzuladen, und der Typ ist leer. UND ... versuche, einen Ordner namens test.jpg zu ziehen und abzulegen - der Typ wird auf "image / jpeg" gesetzt. Um 100% korrekt zu sein, kann man sich nicht nur auf den Typ verlassen (oder wenn überhaupt, wirklich).

In meinen Tests hatten Ordner immer die Größe 0 (auf FF und Chrome auf 64-Bit Windows 7 und unter Linux Mint (im Wesentlichen Ubuntu). Also überprüft mein Ordner nur, ob die Größe 0 ist und es scheint Ich möchte auch keine 0-Byte-Dateien hochladen, wenn es also 0 Byte ist, kommt die Nachricht als "Übersprungen - 0 Bytes (oder Ordner)" zurück.

    
Brian Pipa 13.09.2012 19:25
quelle
0

Zu Ihrer Information: In diesem Beitrag erfahren Sie, wie Sie die dataTransfer-API in Chrome verwenden, um den Dateityp zu erkennen: Ссылка

    
Nam Nguyen 29.07.2013 18:47
quelle