点击按钮上传图片 - HTML5是否允许拖放上传文件夹或文件夹树?




图片上传页面 (5)

我没有看到任何这样做的例子。 api规范中不允许这样做吗?

我正在寻找一个简单的拖放解决方案,用于上传整个文件夹树的照片。



Firefox现在支持文件夹上传,截至2016年11月15日,版本为v50.0: https://developer.mozilla.org/en-US/Firefox/Releases/50#Files_and_directorieshttps://developer.mozilla.org/en-US/Firefox/Releases/50#Files_and_directories

您可以将文件夹拖放到Firefox中,也可以浏览并选择要上载的本地文件夹。 它还支持嵌套在子文件夹中的文件夹。

这意味着您现在可以使用Chrome,Firefox,Edge或Opera上传文件夹。 您目前无法使用Safari或Internet Explorer。


在给HTML 5邮件列表的消息中 ,Ian Hickson说:

HTML5现在必须一次上传许多文件。 浏览器可以允许用户一次选择多个文件,包括跨多个目录; 这有点超出了规范的范围。

(另请参阅原始功能提案 。)因此,可以安全地假设他认为使用拖放操作上传文件夹也超出了范围。 显然,由浏览器来提供单个文件。

正如Lars Gunther所描述的那样,上传文件夹也会遇到一些其他困难:

该提案必须有两张支票(如果可行的话):

  1. 最大尺寸,阻止某人上传数百个未压缩原始图像的完整目录...

  2. 即使省略了accept属性也会过滤。 应省略Mac OS元数据和Windows缩略图等。 默认情况下,应排除所有隐藏文件和目录。


此函数将为您提供所有已删除文件的数组的承诺,例如<input type="file"/>.files

function getFilesWebkitDataTransferItems(dataTransferItems) {
  function traverseFileTreePromise(item, path='') {
    return new Promise( resolve => {
      if (item.isFile) {
        item.file(file => {
          file.filepath = path + file.name //save full path
          files.push(file)
          resolve(file)
        })
      } else if (item.isDirectory) {
        let dirReader = item.createReader()
        dirReader.readEntries(entries => {
          let entriesPromises = []
          for (let entr of entries)
            entriesPromises.push(traverseFileTreePromise(entr, path + item.name + "/"))
          resolve(Promise.all(entriesPromises))
        })
      }
    })
  }

  let files = []
  return new Promise((resolve, reject) => {
    let entriesPromises = []
    for (let it of dataTransferItems)
      entriesPromises.push(traverseFileTreePromise(it.webkitGetAsEntry()))
    Promise.all(entriesPromises)
      .then(entries => {
        //console.log(entries)
        resolve(files)
      })
  })
}

用法:

dropArea.addEventListener("drop", function(event) {
  event.preventDefault();

  var items = event.dataTransfer.items;
  getFilesFromWebkitDataTransferItems(items)
    .then(files => {
      ...
    })
}, false);

现在您可以通过拖放和输入上传目录。

<input type='file' webkitdirectory >

和拖放(对于webkit浏览器)。

处理拖放文件夹。

<div id="dropzone"></div>
<script>
var dropzone = document.getElementById('dropzone');
dropzone.ondrop = function(e) {
  var length = e.dataTransfer.items.length;
  for (var i = 0; i < length; i++) {
    var entry = e.dataTransfer.items[i].webkitGetAsEntry();
    if (entry.isFile) {
      ... // do whatever you want
    } else if (entry.isDirectory) {
      ... // do whatever you want
    }
  }
};
</script>

资源:

http://updates.html5rocks.com/2012/07/Drag-and-drop-a-folder-onto-Chrome-now-available







drag-and-drop