下面的代码在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);
答案 0 :(得分:0)
撤销blob:// URI是同步操作,另一方面,下载文件不是。
即使数据可以存储在内存中并因此下载得非常快,也并非总是如此。 Blob的数据甚至可能不在单个位置,例如某些 blobParts 可能位于内存中,另一些可能位于用户磁盘上,甚至可能位于通过网络访问的共享文件夹中。实际上,也可以简单地异步请求OS进行写访问。
因此,当您调用readFl
时,浏览器可能仍然没有时间将文件写入磁盘,并且尝试将其写入磁盘或访问新的blobPart时,再也没有了指针位于提供的地址处。
不幸的是,没有任何事件可以让我们知道何时完成对磁盘的写入,至少直到native-file-system API成为正式文件为止,所以我们目前能做的最好的事情是等待相当长的时间才能撤销blob:// URI。
供参考,FileSaver.js确实等待40秒。
答案 1 :(得分:0)
我现在像下面一样添加了setimeout,效果很好
setTimeout(function(){window.URL.revokeObjectURL(url);},3000);