【问题标题】:javascript, html5: e.dataTransfer.items vs e.dataTransfer.files, how to get file size with the former? [duplicate]javascript, html5: e.dataTransfer.items vs e.dataTransfer.files,如何用前者获取文件大小? [复制]
【发布时间】:2017-12-21 13:51:41
【问题描述】:

在删除文件并访问这些文件的信息时,使用

let files= e.dataTransfer.files;

您可以检查文件大小 (https://developer.mozilla.org/en-US/docs/Web/API/File)。但是,如果您使用较新的(以及据我所知的替代品)

let items = e.dataTransfer.items;

那么就没有办法获取文件大小(https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items)了。

哪种方法是知道被删除文件大小的正确方法?

答案:通过 .getAsFile() 访问文件

但是,读取目录时如何做到这一点?看代码

let items = e.dataTransfer.items;
for (let i=0; i < items.length; i++) {
    let item = items[i].webkitGetAsEntry();
    if (item && item.isFile)
        console.log(items[i].getAsFile()); // HERE IT WORKS
    else if (item && item.isDirectory) {
        item.createReader().readEntries(function(entries) {
            for (let j=0; j<entries.length; j++)
                see_file(entries[j].getAsFile()); // HERE IT DOES NOT WORK
        });
    }
}

【问题讨论】:

  • 你的问题的答案是什么“知道被删除文件的大小的正确方法是什么?”不包括在问题本身中“当删除文件时并使用let files= e.dataTransfer.files; 访问这些文件的信息,您可以检查文件大小”?使用event.dataTransfer.files 有什么问题?
  • 从我所读到的, .files 似乎已被弃用,取而代之的是 .items (?)
  • 你能提供链接到你读过的.files被弃用的地方吗?
  • “但是,读取目录时如何做到这一点?” 您更新后的查询的解决方案可以在此问题的答案How to upload and list directories at firefox and chrome/chromium using change and drop events 中找到
  • 我正在阅读这个问题,但即使这个问题包含在另一个问题中,它也会回答许多其他问题,这使得这个问题的答案在那里非常模糊。也许从那里提取问题并在此处提供它会很有用。

标签: javascript html drag-and-drop


【解决方案1】:

根据 cmets 提供的答案,我们有以下几点:

如果拖放的项目是目录,则行

item.createReader().readEntries(function(entries) {

生成一个由entries 组成的数组,它们本身就是item.webkitGetAsEntry() 实例。

没有办法访问“父”,比如

 for (let j=0; j<entries.length; j++) {
   let parent = entries[j].parent;
   console.log(parent.webkitGetAsEntry());
   console.log(parent.getAsFile());
   //console.log(entries[j].getAsFile()) -> this fails
}

但是,从上面提到的答案的代码,可以做到这一点

 for (let j=0; j<entries.length; j++) {
  entries[j].file(function(file) {
    console.log(file.webkitGetAsEntry());
    console.log(file.getAsFile());
  });
}

并因此成功访问“父”节点。但我一直无法找到有关此的文档,我错过了什么?

编辑:你可以在这里找到 https://wicg.github.io/entries-api/#api-fileentry (见于 cmets)

【讨论】:

  • 与其在您的答案中提出问题,不如考虑提出一个单独的具体问题? “父”节点是什么意思?你到底想达到什么目的?
  • “父”节点是指父节点,此处解释为developer.mozilla.org/en-US/docs/Web/API/Node/parentNode。我想要实现的是访问 getAsFile() 函数,现在我可以按照文中的说明进行操作。
  • FileDirectory 实例不是节点。您可以通过 if (entry.isFile) { entry.file(function(file) { listFile(file, entry.fullPath).then(resolve) }) } else if (entry.isDirectory) { var reader = entry.createReader(); } 在链接问题的回答中访问 Directory 实例
  • 是的,但是你能告诉我任何解释这个的文件吗?我在任何地方都找不到描述的方法“文件”
  • “是的,但是你能告诉我任何解释这个的文件吗?我找不到任何地方描述的方法“文件””File and Directory Entries API
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
相关资源
最近更新 更多