2011-02-01 10 views
8

He configurado un script de carga de archivos de arrastrar y soltar en JS (AJAX POST) y tengo dificultades para filtrar carpetas en Safari - Versión 5.0.3 (6533.19.4).HTML5 Arrastrar y soltar: detectar carpetas en Safari (FileList, Archivo)

Cada vez que elimino varios archivos/carpetas en el navegador, Chrome filtrará las carpetas y Firefox devolverá 0 para .size, por lo que es trivial proteger contra esos casos. Safari, sin embargo, devolverá un archivo de 68 bytes (el tamaño de la carpeta).

¿Hay alguna forma de comprobar si este File (artículo en FileList) es una carpeta? Parece que no puede encontrar nada en el File/Blob API que pone a prueba para esta condición (no tiene sentido tratar .type, ya que no devuelve nada para los archivos desconocidos, así como las carpetas ...)

Un poco más de información:

Básicamente lo que sucede es que la solicitud AJAX tiene un cuerpo vacío. Estoy subiendo con FormData:

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

he publicado un informe de error para esto: https://bugs.webkit.org/show_bug.cgi?id= 63898 – meleyal

+0

Las últimas versiones de Chrome parecen presentar el mismo problema que Safari. ¿Tuviste algo de suerte rastreando un método estándar para filtrarlos? –

+0

Parece que hay una propiedad 'isDirectory' basada en esta documentación https://developer.mozilla.org/en-US/docs/Web/API/FileSystemEntry/isDirectory pero que podría no ser compatible con Safari. –

Respuesta

-2

¿Por qué no comprobar si hay archivos oldschool-sufijo? Debería funcionar en la mayoría de los casos en los que "file.suf" es un archivo y "archivo" es una carpeta ...

+1

No funciona (hay archivos sin extensiones) pero a falta de una mejor respuesta, estoy marcando esta como correcta. – biasedbit

+0

Parece que hay una mejor manera. Google Docs es capaz de distinguir archivos y carpetas durante Ajax Drop. Procesa los archivos sin extensión correctamente, como un archivo. Realmente interesado en cómo se logró esto. –

0

Se puede detectar si se trataba de un archivo o carpeta en el servidor utilizando los datos post prima: Get raw post data

Observé que las carpetas solo tienen límites de formulario al principio y ninguno al final. Así que, básicamente, parece que el navegador comienza a publicar y luego se detiene antes de completar la solicitud. (Solo probé esto con safari pero supongo que es lo mismo con otros navegadores).

Puede guardar la carga fallida en la sesión y luego usar AJAX para comprobar si la carga fallida generó tal solicitud. Tienes una solicitud AJAX adicional, pero al menos puedes detectarla. Es la mejor opción que he encontrado hasta ahora.

0

Podemos leer un archivo, con FileReader. El código puede ser como este:

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

Para las carpetas que dará error:

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