Обнаружение локального файла drag'n'drop с помощью HTML/JavaScript

Существует текстовая область HTML. Я могу поймать это событие, когда локальный файл перетаскивается и помещается в текстовое поле. Но как получить имя отброшенного файла? (для окончательной модификации и вставки в текстовое поле).

Следующие выражения в этом случае возвращают None:

event.dataTransfer.files
event.dataTransfer.getData('text/plain')

Я сделал короткий пример для Firefox 3, который в настоящее время является моей целевой платформой.

<script>
function init() {
    document.getElementById('x').addEventListener('drop', onDrop, true)
}
function onDrop(event) {
    var data = event.dataTransfer.getData('text/plain')
    event.preventDefault()
    alert('files: ' + event.dataTransfer.files + ' && data: ' + data + '.')
}
</script>

<body onload='init()'>
<textarea cols=70 rows=20 id='x'></textarea>

Ответ 1

Это немного поздно, но я думаю, что вы ищете:

event.dataTransfer.files[0].name

Вы также можете получить следующие свойства:

event.dataTransfer.files[0].size
event.dataTransfer.files[0].type

И вы можете прокручивать эти файлы со следующим:

var listOfNames='';
for(var i=0,tot=event.dataTransfer.files.length; i<tot; i++){
    listOfNames+=event.dataTransfer.files[i].name + '\r\n';
}

Btw - если вы используете jQuery, то объект dataTransfer можно найти здесь:

event.originalEvent.dataTransfer.files[0].name

Ответ 2

Не знаю, насколько это актуально, но я столкнулся с той же проблемой. Вот как я это решил:

  • Создайте обычную форму загрузки с одним полем ввода (type="file")
  • Добавьте этот атрибут HTML в поле ввода:

    dropzone = "copy file: image/png file: image/jpg file: image/jpeg"

  • Установите прослушиватель JQuery или что угодно, чтобы поймать "drop" -event в поле ввода

При перетаскивании локального изображения в поле ввода атрибут "значение" заполняется автоматически, и вы можете обрабатывать его, как и любую другую HTML-форму.

Я также обернул форму в другой элемент HTML (div), установил размер div и set overflow: скрытый через CSS - таким образом вы можете избавиться от кнопки "просмотреть". Это не приятно, но это работает. Я также использовал плагин AjaxForm для загрузки изображения в фоновом режиме - работает очень хорошо.

Ответ 3

насколько мне известно, вам нужно получить экземпляр nsIFile, чтобы получить путь к файлу (класс File не предлагает эту функцию).
На этой странице MDC объясняется, как это сделать: https://developer.mozilla.org/En/DragDrop/Recommended_Drag_Types#file.
Обратите внимание, что, хотя это не указано в предыдущей ссылке, получение экземпляра nsIFile требует повышения привилегий (см. Мой ответ на Могу ли я перетаскивать файлы с рабочего стола на область сбрасывания в Firefox 3.5 и инициировать загрузку? показать, как это сделать).

Ответ 4

im, делая это, обнаруживая наведение мыши и mousedown в зоне "Drop"

Ответ 5

Alemjerus прав, у вас нет доступа к тому, что вы ищете.

Поведение, о котором вы упоминали в ответ на его комментарий, является поведением некоторых браузеров по умолчанию. Например, с текстовой областью stackoverflow для этой записи, если я использую Safari и перетаскиваю в нее файл, он помещает путь к файлу в текстовое поле. С firefox 3.5, с другой стороны, он пытается открыть файл в браузере.

В принципе, функция "перетаскивания", которую вы пытаетесь реализовать, - это то, что обрабатывается браузером и ОС на клиентской машине - вы не можете использовать Javascript для этой цели.

Ответ 6

Вы не можете сделать это с помощью Javascript из соображений безопасности. Javascript VM не имеет прямого доступа к файловой системе ОС. Вы можете только перетаскивать текст.