我正在尝试下载用户已选择下载的多个文件。但是,浏览器将取消除上一次下载请求外的所有请求。如果我将请求之间的延迟增加到大约1秒,那么将下载那些文件,但是即使在这种情况下,有时也会丢失一些文件。这些文件是从Amazon s3网址下载的(即这些是CORS)。
我是通过使用url创建锚元素,然后使用javascript对其调用click事件来实现的。
downloadFile(url) {
let a = document.createElement('a');
a.id = url;
// a.setAttribute('target', 'blank');
a.download = '';
a.href = url;
// firefox doesn't support `a.click()`...
// console.log('dowmloading ' + url);
a.dispatchEvent(new MouseEvent('click'));
a.remove();
}
然后点击下载按钮点击事件,我正在这样做:
let delay = 0;
urlList.forEach(url => {
return setTimeout(downloadFile.bind(null, url), 100 * ++delay);
});
有没有办法做到这一点?
浏览器为什么取消请求?
答案 0 :(得分:2)
浏览器为什么取消请求?
因为本质上是通过单击下一个链接来“取消导航”,所以在浏览器完全完成单击前一个链接时的操作之前就可以了。
如果这不是下载内容,而是常规的指向页面的链接,那么这就是您的想要的行为-如果用户先单击指向页面A的链接,然后失去耐心,然后单击另一个链接到页面B,则对页面A的请求将被取消-无需加载两个资源,因为无论如何只能同时显示一个资源。
如果您不想弄清楚超时以某种方式使其“起作用”的“幻数”,我认为您无能为力,尤其是因为您不知道是否可以做到这一点可以正常工作,或者可以在您的计算机上,通过Internet连接等运行。
我正在尝试下载用户选择下载的多个文件。
您可以在服务器上动态地将那些选择的文件包装成容器格式,例如ZIP(严格来说,不仅仅是一个“容器”),这样用户只需下载一个< / em>文件(然后他们将不得不在自己的计算机上重新解压缩文件)。
或者您可以从一开始就更改文件选择过程。与其让用户使用复选框或类似的方式标记所需的文件,不如向他们展示直接指向文件的链接?然后,他们可以依次单击想要的每个按钮,然后将执行“正常”下载功能。