【问题标题】:Angular download PDF on IOS mostly opens in same tabIOS 上的 Angular 下载 PDF 大多在同一选项卡中打开
【发布时间】:2021-01-18 14:14:35
【问题描述】:

我在我的 Angular 应用程序中使用文件保护程序来下载在我的后端生成的 PDF。该库通常在桌面和 android 上运行良好。但我似乎无法在 IOS 上下载文件。如 GitHub 页面中所述,文件保护程序也不会在新页面中打开 blob。它只是在同一页面上打开(不需要)。有趣的是,它在 safari 中运行良好(它会打开一个对话框,要求我下载,然后在不打开的情况下下载它)。在任何其他浏览器(opera、firefox 和 chrome)中,它似乎都不起作用。

我已经尝试了文件保护程序、downloadJ、自己创建一个锚标记以及下载属性、使用 application/octet-stream mime-type 和互联网上发布的其他几个解决方案。大多数浏览器中的所有这些方法都什么都不做,或者在同一页面中打开 PDF blob,而不是下载它或在新选项卡中打开它(正如文件保护程序在 IOS 上所说的那样)。

我正在 Google Cloud 函数中生成 PDF。有没有办法跳过整个客户端,让浏览器直接从那里下载文件?

是否有人对如何在移动 IOS 上下载 PDF 有其他想法(例如,通过服务人员或其他方式)?

提前致谢

【问题讨论】:

  • 可能是浏览器 PDF 扩展问题。
  • 这是什么意思?我该如何测试甚至修复它?
  • 可能是浏览器选项绕过了http请求类型,检查this one之类的设置。如果有任何东西,还要检查浏览器的扩展设置。也尝试停用 PDF 扩展。

标签: javascript angular typescript filesaver.js


【解决方案1】:

根据新 chrome 规范 https://developers.google.com/web/updates/2018/02/chrome-65-deprecations 的最佳解决方案

原版 JavaScript

public static downloadFile(url: string): void {
     const xmlHttp = new XMLHttpRequest();
     xmlHttp.onreadystatechange = () => {
       if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {
         const blobUrl = window.URL.createObjectURL(xmlHttp.response);
         const e = document.createElement('a');
         e.href = blobUrl;
         e.download = blobUrl.substr(blobUrl.lastIndexOf('/') + 1);
         document.body.appendChild(e);
         e.click();
         document.body.removeChild(e);
       }
     };
     xmlHttp.responseType = 'blob';
     xmlHttp.open('GET', url, true);
     xmlHttp.send(null);
   }

如果你使用 angular 试试这个。

async downloadBrochure(url: string) {
    try {
      const res = await this.httpClient.get(url, { responseType: 'blob' }).toPromise();
      this.downloadFile(res);
    } catch (e) {
      console.log(e.body.message);
    }
  }

  downloadFile(data) {
    const url = window.URL.createObjectURL(data);
    const e = document.createElement('a');
    e.href = url;
    e.download = url.substr(url.lastIndexOf('/') + 1);
    document.body.appendChild(e);
    e.click();
    document.body.removeChild(e);
  }

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @StefanoA。此处添加了完整答案。请删除devote
  • 谢谢,高拉夫!我没有对您的答案投反对票,只是想分享一些改进答案的技巧。
猜你喜欢
  • 2019-05-26
  • 2021-12-02
  • 1970-01-01
  • 2020-03-02
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2017-08-06
相关资源
最近更新 更多