1

我正在尝试根据从服务器返回的响应生成 PDF 文件并在新选项卡中打开该文件。它在所有浏览器的桌面上运行良好,但在 safari 浏览器中的苹果设备(iphone + ipad)中存在问题。

这是代码片段:

if (responseType = base64 encoded string like JVBERi0xLjUKJeLjz9MKMSAwI....) {
   const binaryString = window.atob(fileResponseData);
   const bytes = new Uint8Array(binaryString.length);
   const binaryToBlob = bytes.map((byte, i) => binaryString.charCodeAt(i));
   const blob = new Blob([binaryToBlob], { type: 'application/pdf' });
   this.downloadFile(blob, fileName);
} else {
   // blob response like %PDF-1.7 %âãÏÓ5 0 obj....
   const blob = new Blob([fileResponseData], { type: 'application/pdf' });
   this.downloadFile(blob, fileName);
}

这就是我下载文件的方式

if (window.navigator && window.navigator.msSaveOrOpenBlob) {
   window.navigator.msSaveOrOpenBlob(blob, fileName);
   return;
}

const url = (window.URL || window.webkitURL).createObjectURL(blob);
window.open(url, '_blank');

我知道有关于这个主题的相关文章,但它们并没有解决我的问题。事实上,我想出了上面提到这些文章本身的代码,但我仍然面临苹果设备的问题。一旦我单击按钮生成文件并在新选项卡中显示,苹果设备上没有任何反应,但其他设备工作正常。

4

1 回答 1

0

我在使用 iOS 14.3 的 iPhone 6s+ 上遇到了同样的问题。看起来这是 iPhone/iPad 上 Safari 的一项功能,如果window.open()停留在一些不同的事件(例如onload/onloadend事件或setTimeout)中,它会阻止弹出窗口。您可以尝试移动window.open()到另一个范围或函数以查看结果。

至于我的问题,我通过创建一个隐藏的锚标记然后单击它来解决它:

mySmallDiv.innerHTML = '<a href="+'url'+" target="_blank" id="openPdf">&nbsp;</a>';
document.getElementById("openPdf").click();

但 Safari 可能仍会阻止它,因此请相应地更改您的代码。
而且,不要忘记URL.revokeObjectURL(url)在超时后打电话。

FileReader()另外,如果浏览器是 Chrome iOS ,我认为您需要使用。

于 2021-07-25T12:27:57.213 回答