2011-02-01 13 views
8

Mam skonfigurowany skrypt przesyłania plików typu przeciągnij i upuść w JS (AJAX POST) i mam problemy z filtrowaniem folderów w Safari - wersja 5.0.3 (6533 194).HTML5 Przeciąganie i upuszczanie - wykrywanie folderów w Safari (FileList, File)

Ilekroć upuszczam wiele plików/folderów do przeglądarki, Chrome odfiltruje foldery, a Firefox zwróci 0 za .size, więc jest to banalne, aby chronić się przed tymi przypadkami. Safari jednak zwróci 68 bajtowy plik (rozmiar folderu).

Czy istnieje sposób sprawdzenia, czy ta File (pozycja w FileList) jest folderem? nie wydaje się znaleźć coś w File/Blob API że testy dla tej choroby (bez sensu .type, ponieważ nic nie zwraca nieznanych plików, jak i folderów ...)

Nieco więcej informacji:

Zasadniczo to, że żądanie AJAX ma puste ciało. Ja przesyłając z FormData:

var file = ...; // the dropped file 
var formData = new FormData(); 
formData.append("file", file); 
var xhr = new XMLHttpRequest(); 
... 
xhr.send(formData); 
+1

napisałem raport o błędzie na to: https://bugs.webkit.org/show_bug.cgi?id= 63898 – meleyal

+0

Najnowsze wersje Chrome wydają się przedstawiać ten sam problem, co przeglądarka Safari. Czy miałeś szczęście, szukając standardowej metody ich filtrowania? –

+0

Wygląda na to, że istnieje własność 'isDirectory' oparta na tej dokumentacji https://developer.mozilla.org/en-US/docs/Web/API/FileSystemEntry/isDirectory, ale ta funkcja może nie być obsługiwana w Safari. –

Odpowiedz

-2

Dlaczego nie po prostu sprawdzić na oldschool file-przyrostek? Powinien działać na większości przypadków, gdzie „file.suf” jest plikiem i „plik” jest folder ...

+1

Nie całkiem radzę sobie (są pliki bez rozszerzeń), ale brakuje im lepszej odpowiedzi, zaznaczam to jako prawidłowe. – biasedbit

+0

Wygląda na to, że jest lepszy sposób. Dokumenty Google są w stanie rozróżniać pliki i foldery podczas upuszczania Ajaxa. Przetwarza pliki bez rozszerzenia, jako plik. Naprawdę zainteresowani, w jaki sposób zostały one osiągnięte. –

0

Można wykryć, czy był to plik lub folder na serwerze z wykorzystaniem nieprzetworzonych danych postu: Get raw post data

Zauważyłem, że foldery mają tylko granicę formy na początku i żadne na końcu. Zasadniczo wygląda na to, że przeglądarka zaczyna robić post, a następnie zatrzymuje się przed wypełnieniem żądania. (Testowałem to tylko na safari, ale przypuszczam, że tak samo jest z innymi przeglądarkami.)

Można zapisać nieudany upload w sesji, a następnie użyć AJAX, aby sprawdzić, czy nieudane przesyłanie wygenerowało takie żądanie. Masz dodatkowe żądanie AJAX, ale przynajmniej możesz je wykryć. To najlepsza opcja, jaką do tej pory znalazłem.

0

Możemy odczytać plik z FileReader. Kod może być tak:

Array.prototype.forEach.call(e.dataTransfer.files, function (file) { 
    var reader = new FileReader(); 
    reader.onload = function (event) { 
    // it's a file 
    addFile(file); 
    }; 
    reader.onerror = function (event) { 
    alert("Uploading folders not supported in Safari"); 
    } 
    reader.readAsDataURL(file); 
}); 

przypadku folderów to daje błąd:

Failed to load resource: The operation couldn’t be completed. (WebKitBlobResource error 4.) 
Powiązane problemy