【发布时间】:2019-10-08 05:55:12
【问题描述】:
在 chrome、edge 和 IE 中下载多个 blob 似乎不是问题,但在 Firefox 上我遇到的问题是大多数时候只有最后一个文件或最大文件。其中 2 个将被“下载”。我搜索了一个“下载 blob”代码并将其调整为一次下载更多内容,并且该问题可以在我的机器上在 Windows 10 上的最新 Firefox 版本上重现,请参阅下面 Firefox 中的 JS 代码。
var saveData = (function () {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function (data, fileName) {
var json = JSON.stringify(data),
blob = new Blob([json], {type: "octet/stream"}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
};
}());
var data = { x: 42, s: "hello, world", d: new Date() },
fileName = "my-download.json";
saveData(data, fileName);
saveData(data, fileName + 1);
saveData(data, fileName + 2);
saveData(data, fileName + 3);
saveData(data, fileName + 4);
saveData(data, fileName + 5);
saveData(data, fileName + 6);
saveData(data, fileName + 7);
它似乎适用于以下更改,但问题是真正的专业解决方案是什么?
var saveData = (function () {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function (data, fileName) {
var json = JSON.stringify(data),
blob = new Blob([json], {type: "octet/stream"}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
};
}());
var data = { x: 42, s: "hello, world", d: new Date() },
fileName = "my-download.json";
saveData(data, fileName);
setTimeout(function(){ saveData(data, fileName + 0) }, 1000);
setTimeout(function(){ saveData(data, fileName + 1) }, 2000);
setTimeout(function(){ saveData(data, fileName + 2) }, 3000);
它也可以使用 1,2,3ms 作为参数来处理这么多文件,但是对于更多的文件,它开始使用 100ms,更少的一些文件会被浏览器“吃掉”。
我认为浏览器在“合并”点击或加载事件下有一个阈值,现在的问题是每个浏览器的阈值是多少,是否有比我目前的方法更好的解决方案?
【问题讨论】:
-
你需要隐藏链接吗?您可以拨打
a.remove()进行清理;您可能需要一个新的锚每个文件。你可能需要一个超时来防止它被备份。 -
@Ry 提出的问题找到了一个对他们似乎有帮助的答案:stackoverflow.com/questions/27115748/…
-
@computercarguy:OP 附加到正文。虽然可能是标签回收......
-
@dandavis,我发现现在情况不一样了。如果是标签重用,我希望它选择标签的第一个,而不是最后一个,但是不同的浏览器......无论如何,OP肯定需要调查它。
标签: javascript html firefox blob