Chrome 无法使用JS从S3预签名URL下载多个文件

dxxyhpgq  于 2022-12-06  发布在  Go
关注(0)|答案(1)|浏览(272)

在我开始回答这个问题之前,我已经看过很多关于类似问题的stackoverflow答案(包括那些已经被问到但到现在还没有回答的问题)。我还看过一篇中等文章。所以,我做了相当多的研究。
我一直在尝试使用预先签名的url下载多个文件。下面的代码几天前就可以工作了(这听起来可能很熟悉;))但目前我只能下载一个文件,下载也是随机的。有时下载第一个文件,有时下载最后一个。代码如下:

downloadItem() {
  let urls = [];
  for(let item of this.selectedRowsData) {
    //calling the service to fetch the presigned url
    this.dataService.getPresignedToDownloadAll(
      item.value,
      item.id).subscribe((res) => {
        urls.push(res);
        this.download(urls);
        /**if(urls.length === selectedRowData.length) {
           this.download(urls);
        }**/ //have tried this code too where I just invoke download only once when I have all the presigned urls
    });
 }
}
download(urls: any) {
  var self = this;
  var url = urls.pop();
  setTimeout(function(){
    self.snackBarService.loadComponent({
      isSuccess: true,
      message: MESSAGES.downloadInProgress,
    });
  var a = document.createElement('a');
  a.setAttribute('href', url);
  document.body.appendChild(a);
  a.setAttribute('download', '');
  a.setAttribute('target', '_self');
  a.click();
  // a.remove();
  }, 1000)
}

任何帮助都是非常感谢的。

unhi4e5o

unhi4e5o1#

我不能下载多个图像从预先签署的网址在同一个浏览器选项卡,这是我试图做的a.setAttribute('target', '_self');
但是我可以通过将target设置为_blank来使它工作,这样会打开一个新的标签页,但在下载完成后会关闭那些打开的标签页。虽然这不是一个很好的用户体验,但到目前为止,我们已经完成了这个实现。这是最终的代码

downloadItem() {
  let urls = [];
  for(let item of this.selectedRowsData) {
  //calling the service to fetch the presigned url
  this.dataService.getPresignedToDownloadAll(
    item.value,
    item.id).subscribe((res) => {
      urls.push(res);
      this.download(urls);
   });
 }
}

download(urls: any) {
  var self = this;
  var url = urls.pop();
  setTimeout(function(){
    self.snackBarService.loadComponent({
      isSuccess: true,
      message: MESSAGES.downloadInProgress,
    });
  var a = document.createElement('a');
  a.setAttribute('href', url);
  a.setAttribute('download', '');
  a.setAttribute('target', '_blank');
  document.body.appendChild(a);
  a.click();
 // a.remove();
 }, 1000)
}

相关问题