Перетащите n drop из файловой системы в веб-приложение - PullRequest
6 голосов
/ 05 марта 2010

Я изучаю веб-фреймворк / техно, который позволяет перетаскивать n-файлы из файловой системы в веб-приложение. Цель состоит в том, чтобы загрузить эти файлы на сервер приложений.

В Flex это кажется невозможным (хотя он работает с AIR). Я нашел способ с Google Gears, но это заставляет пользователя устанавливать Gears как плагин для браузера.

С Java-апплетом это кажется возможным, но для этого требуется, чтобы пользователь принял исключение из правила безопасности ... (для меня это странно, поскольку чтение файла, указанного пользователем через DnD, не "менее безопасно", чем если пользователь указал файл через стандартное классическое диалоговое окно загрузки ...).

Есть ли какой-нибудь ненавязчивый способ разрешить эту функцию, не устанавливая плагин и не принимая окно с предупреждением о безопасности?

Ответы [ 3 ]

4 голосов
/ 05 марта 2010

Firefox 3.6 и, по-видимому, последняя версия Safari (возможно, Webkit по ночам) поддерживают это через HTML5.Я играл с этим недавно, и это работает довольно хорошо.Приведенный мной пример просто вставляет миниатюры на страницу, но это можно настроить для загрузки данных на сервер.Вот код JavaScript / jquery, который я написал, не стесняйтесь использовать это:

function debug(string) {
  $("#debugArea").append(string);
}

$(function() {
  // We need to override the dragover event, otherwise Firefox will just open the file on drop
  $("#dropArea").bind("dragover", function(event) {
    event.preventDefault();
  });

  // This is where the actual magic happens :)
  $("#dropArea").bind("drop", function(event) {
    event.preventDefault();
    debug("Dropped something: ");
    // Since jquery returns its own event object, we need to get the original one in order to access the files
    var files = event.originalEvent.dataTransfer.files;
    // jquery nicely loops for us over the files
    $(files).each(function(index, file) {
     if(!file.type.match(/image.*/)) { // Skip non-images
        debug(file.name)
        debug(" <em>not an image, skipping</em>; ");
        return;
      }

      // We need a new filereader for every file, otherwise the reading might be canceled by the next file
      var filereader = new FileReader();
      filereader.onloadend = function(event) { $("#thumbnails").append("<img src='"+event.target.result+"' width='100px' />"); };
      debug(file.name);
      debug("; ");

      // Read the file in data URL format so that we can easily add it to an img tag.
      filereader.readAsDataURL(file);
    });
    debug("<br/><br/>");
  })

});

И HTML-код для него:

<div id="dropArea">
  <p>Drop images here!</p>
</div>
<div id="thumbnails">
</div>
<div id="debugArea">
  <strong>Debug Info:</strong><br/>
</div>
4 голосов
/ 05 марта 2010

номер

Браузеры, как правило, не поддерживают встроенные функции такого рода.

0 голосов
/ 15 августа 2014

Теперь это возможно благодаря использованию HTML5 File API .

Можно даже перетаскивать папки .

...