1

下面的代码在 Chrome 中显示“找不到文件”错误,但相同的代码适用于 chrome 中的其他一些环境,并且在添加了一些时间延迟后它正在工作。
请告知我当地环境所需时间延迟的原因。

var a = document.createElement('a');
a.style = "display: none";  
var blob = new Blob(data, {type: "application/octet-stream"});
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);     
4

2 回答 2

1

我已经添加了如下所示的 setimeout 现在它工作正常

setTimeout(function(){ window.URL.revokeObjectURL(url); }, 3000);

于 2020-08-20T14:50:51.033 回答
0

撤销 blob:// URI 是同步操作,而下载文件则不是。

尽管数据可以在内存中,因此下载速度非常快,但情况并非总是如此。Blob 的数据甚至可能不在一个地方,例如,一些blobParts可能在内存中,其他一些在用户磁盘上,甚至在通过网络访问的共享文件夹中。此外,实际上可以异步地简单地请求操作系统访问写入。

因此,当您调用revokeObjectURL时,浏览器可能还没有时间将文件写入磁盘,当它尝试这样做或访问新的 blobPart 时,在提供的地址上没有更多可用的指针。

不幸的是,没有任何事件让我们知道何时完成对磁盘的写入,至少在本机文件系统 API正式发布之前,所以我们现在能做的最好的事情就是在撤销 blob 之前等待相当长的时间:// 网址。
作为参考,FileSaver.js确实等待了 40 秒。

于 2020-07-27T08:28:58.893 回答