Blob createObjectURL 下载在 Chrome 中不起作用

use*_*192 3 javascript revokeobjecturl

下面的代码在 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);     
Run Code Online (Sandbox Code Playgroud)

Kai*_*ido 5

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

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

因此,当您调用 时revokeObjectURL,浏览器可能仍然没有时间将文件写入磁盘,并且当它尝试这样做或访问新的 blobPart 时,所提供的地址处不再有可用的指针。

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