Firefox无法一次下载多个文件吗?

时间:2019-05-21 19:14:39

标签: javascript html firefox blob

下载chrome,edge和IE中的多个blob似乎不是问题,但是在Firefox上,我遇到的问题是,大多数情况下,只有最后一个文件或max。其中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开始工作,浏览器将“吞噬”掉一些文件。

我想是浏览器在其“合并”点击或加载事件下有一个休止符,现在的问题是每个浏览器的休止符是什么,还有没有比我目前的方法更好的解决方案?

1 个答案:

答案 0 :(得分:1)

您要尝试做的就是“地毯炸弹”。

它包括用大量文件填充用户磁盘,直到空间用尽。
就其本身而言,即使它可能导致系统崩溃,安全风险也很低,比任何危险都更无聊。
但是,在某些情况下,它可能导致无法预料的缺陷,例如"Safari carpet-bomb" attack就是这种情况。
也许更重要的是,将大量的文件以及其他不相关的文件堆积在downloads文件夹中,这几乎不是一个好的UX。

因此,浏览器实际上是quite open来篡改此问题,并且大多数浏览器都具有适当的系统来避免此问题。


现在,这些篡改系统可能有很多解决方法,但我认为这不是您所需要的。

您问“ 是否有比您当前的方法更好的解决方案”,答案是肯定的。

如果您一次单击即可下载所有文件,则将它们打包为一个文件进行下载。

您可以通过使用许多zipping库之一甚至所有其他压缩算法(取决于目标客户端)从所有Blob生成zip文件来实现此目的。

const blobs = "This is a sample text that will get split in chunks of separate text files"
  .split(' ')
  .map((txt) => new Blob([txt])); 

const zip = new JSZip();
const folder = zip.folder('some-words');

blobs.forEach((blob, i) =>
  folder.file(`a-word_${i}.txt`, blob)
);

zip.generateAsync({type : "blob"})
  .then(zip_blob => {
    dl.href = URL.createObjectURL(zip_blob);
    dl.download = "myfiles.zip";
  });
<!-- using JSZip library https://stuk.github.io/jszip/ -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.2.0/jszip.min.js"></script>
<a id="dl">download</a>