2011-02-01 18 views
8

Ho impostato uno script di trascinamento del caricamento file in JS (AJAX POST) e ho difficoltà a filtrare le cartelle in Safari - Versione 5.0.3 (6533.19.4).HTML5 Drag and Drop - rileva le cartelle in Safari (FileList, File)

Ogni volta che mi calo più file/cartelle nel browser, Chrome filtrare le cartelle, e Firefox restituirà 0 per .size quindi è banale per la protezione contro questi casi. Safari, tuttavia, restituirà un file di 68 byte (la dimensione della cartella).

C'è un modo per verificare se questo File (articolo in FileList) è una cartella? non riesco a trovare nulla nel File/Blob API che i test per questa condizione (nessun punto nel tentativo .type, dal momento che non restituisce nulla per i file sconosciuti così come le cartelle ...)

Un po 'più di informazioni:

Fondamentalmente ciò che accade è che la richiesta AJAX ha un corpo vuoto. Sto caricando con FormData:

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

ho postato un bug report per questo: https://bugs.webkit.org/show_bug.cgi?id= 63898 – meleyal

+0

Le ultime versioni di Chrome sembrano presentare lo stesso problema di Safari. Hai avuto fortuna nel rintracciare un metodo standard per filtrarli? –

+0

Sembra che esista una proprietà 'isDirectory' basata su questa documentazione https://developer.mozilla.org/en-US/docs/Web/API/FileSystemEntry/isDirectory ma che potrebbe non essere supportata in Safari. –

risposta

-2

Perché non verificare la presenza di file-suffisso oldschool? Dovrebbe funzionare sulla maggior parte dei casi in cui "file.suf" è un file e "file" è una cartella ...

+1

Non fa proprio il trucco (ci sono file senza estensioni) ma manca una risposta migliore, sto contrassegnando questo come giusto. – biasedbit

+0

Sembra che ci sia un modo migliore. Google Documenti è in grado di distinguere file e cartelle durante il rilascio Ajax. Elabora i file senza estensione correttamente, come un file. Davvero interessante il modo in cui sono stati raggiunti. –

0

Si potrebbe rilevare se fosse un file o una cartella sul server utilizzando i dati grezzi messaggio: Get raw post data

Ho notato che le cartelle hanno solo un limite di forma all'inizio e nessuno alla fine. Quindi in pratica sembra che il browser inizi a fare il post e poi si fermi prima di completare la richiesta. (Ho provato solo questo con Safari, ma credo che sia lo stesso con altri browser.)

È possibile salvare il caricamento non riuscito nella sessione e quindi utilizzare AJAX per verificare se il caricamento non riuscito ha generato tale richiesta. Hai una richiesta AJAX adizionale, ma almeno puoi rilevarla. È l'opzione migliore che ho trovato finora.

0

Siamo in grado di leggere un file, con FileReader. Il codice può essere simile a questo:

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); 
}); 

Per le cartelle che vi darà errore:

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