Ответ 1
TL;DR you can't :(
If you're wondering why this question still hasn't got an accepted answer, you can read this meta question created by the OP, and my answer.
Файл drag
/drop
в HTML5
Я провел несколько исследований по разной документации по этой теме и проверил ее самостоятельно в различных браузерах, поэтому решил обобщить все, что я знаю о перетаскивании файлов, здесь.
Перетаскивание
При перетаскивании файла вы можете использовать несколько слушателей, например:
dragenter
dragover
dragend
dragleave
Учитывая, что это события drag
, свойство files
для event.dataTransfer
будет иметь length == 0
или быть пустым (null
).
Вы не можете прочитать информацию о файлах в событии перетаскивания и не можете проверить, являются ли они папками. Это не ошибка, это мера безопасности.
Представьте, что вы можете читать файлы в событии перетаскивания: вы сможете читать все, даже если пользователь не хочет загружать файлы на ваш сайт. Это не имеет смысла, серьезно. Представьте, что вы перетаскиваете файл со своего рабочего стола в другую папку и случайно перетаскиваете его через веб-страницу: теперь веб-страница читает ваш файл и сохраняет вашу личную информацию на своем сервере... , что было бы огромным недостатком безопасности.
Однако вы все равно сможете определить, перетаскивает ли пользователь файлы (и под файлами, я имею в виду и папки, потому что папки являются файлами), или нет, перебирая массив event.dataTransfer.types
. Вы можете создать функцию, которая проверяет, содержат ли событие перетаскивания файлы, а затем вызывать ее в обработчике событий.
Пример:
function containsFiles(event) {
if (event.dataTransfer.types) {
for (var i=0; i<event.dataTransfer.types.length; i++) {
if (event.dataTransfer.types[i] == "Files") {
return true;
}
}
}
return false;
}
function handleDragEnter(e) {
e.preventDefault();
if (containsFiles(e)) {
// The drag event contains files
// Do something
} else {
// The drag event does not contain files
// Do something else
}
}
капают
Когда вы помещаете файл в <div>
(или любой другой элемент, который вы используете в качестве dropzone), вы будете использовать прослушиватель для события drop
для чтения некоторых свойств файла, таких как имя, размер, тип и дата последнего изменения..
Чтобы определить, является ли файл папкой, вы должны:
- Проверьте, есть ли в файле
type == ""
, потому что у папок нет типа. - Проверьте, кратен ли размер файла 4096:
size%4096 == 0
, поскольку размер папок всегда кратен 4096 байтам (что составляет 4 КБ).
Пример:
function handleDrop(e) {
e.stopPropagation();
e.preventDefault();
var files = e.dataTransfer.files;
for (var i = 0, f; f = files[i]; i++) { // iterate in the files dropped
if (!f.type && f.size%4096 == 0) {
// The file is a folder
// Do something
} else {
// The file is not a folder
// Do something else
}
}
}
ИЗВЕСТНЫЙ ПРОБЛЕМА: Поскольку эти папки на самом деле являются файлами, это единственный способ отличить их от файлов другого типа. Хотя этот метод не дает вам абсолютной уверенности в том, что файл является папкой: это может быть файл без расширения и размером 0 или ровно N x 4096B.
Рабочие примеры
Вот несколько рабочих примеров, чтобы увидеть то, что я сказал выше в действии, и проверить это самостоятельно. Перед запуском убедитесь, что ваш браузер поддерживает функции перетаскивания. Веселитесь:
- Информация об отбрасывании файлов (сделано мной)
- Распознавание файлов/папок (сделано мной)
- Обнаружение перетаскивания файла (из трюков css)