Google chrome chrome PDF查看器可以';下载文件

Google chrome chrome PDF查看器可以';下载文件,google-chrome,pdf,pdf-viewer,Google Chrome,Pdf,Pdf Viewer,这是我的情况,我有一个运行PDF生成器的服务器,当我用一些参数发出请求时,它会返回一个PDF文件,PDF不会存储在运行时生成的服务器中 一切都很顺利,我可以在chrome的PDF查看器中打开PDF,但是如果要下载文件,就会出现错误,如图所示。 因为Chrome会转到源URL请求文件,但该文件不是服务器上的静态资源 我不知道是否有人遇到过这个问题?Chrome内置的PDF查看器将通过PDF的源URL下载PDF文件。因此,如果PDF是在服务器运行时生成的,并且没有存储在服务器中,下载可能会失败 请

这是我的情况,我有一个运行PDF生成器的服务器,当我用一些参数发出请求时,它会返回一个PDF文件,PDF不会存储在运行时生成的服务器中

一切都很顺利,我可以在chrome的PDF查看器中打开PDF,但是如果要下载文件,就会出现错误,如图所示。

因为Chrome会转到源URL请求文件,但该文件不是服务器上的静态资源


我不知道是否有人遇到过这个问题?

Chrome内置的PDF查看器将通过PDF的源URL下载PDF文件。因此,如果PDF是在服务器运行时生成的,并且没有存储在服务器中,下载可能会失败


请参阅此处的链接:

每当您离开用于创建对象URL(
window.URL.createObjectURL(…)
)的网站时,该对象将被垃圾收集。因此,您需要以某种方式保留对该对象的引用

这适用于我们在Chrome、Firefox、Safari、iOS Safari和Android中,首先在功能强大的浏览器中以新选项卡显示PDF,然后允许下载(在IE中,它只是开始下载):

我们在一个新的浏览器选项卡中打开了PDF,并且遇到了类似的问题


对我们来说,当我们使用window.URL.createObjectURL而不是tabWindow.URL.createObject时,它又开始工作了。tabWindow.URL.createObject显示了PDF,但不允许下载。

作为附加注释:

我们在一个项目中遇到了同样的问题,仅在Chrome上

经过身份验证的
GET
请求将从API获取PDF作为附件,我们将通过
window.createObjectURL(blob)
将其转发到浏览器查看器

网络错误
是由于我们调用了
窗口。revokeObjectURL(url)打开PDF后。当我们拆下那条线时,打开后没有立即对blob进行垃圾收集

fetch(request)
   .then(async response => {

       if (!response.ok) {
         return reject(response.statusText);
       }

       const blob = await response.blob();
       const url = await window.URL.createObjectURL(blob);

       window.open(url, '_blank');
       URL.revokeObjectURL(url); // This line was causing the problem
       resolve();
   })
   .catch(reject)

我们有同样的问题。。。还没有解决方案。你尝试过这里建议的解决方案吗?@flob我在Google chrome的群组中发布了这个,据说通过PDF的源URL下载PDF是chrome内置PDF查看器的默认行为。现在我们的解决方案是使用“PDF.js”作为服务器内置的默认PDF查看器。有关更多信息,您可以查看“PDF.js”github页面。我们找到了一个解决方案,在发布答案时,我意识到这是因为用于createObjectURL的窗口对象在显示的PDF替换网站时被垃圾收集。非常感谢
URL.revokeObjectURL(URL);//这一行导致了问题
我调试Chrome特定问题已经10个多小时了,因为你,我把问题缩小到这一行。解决了我的问题!
fetch(request)
   .then(async response => {

       if (!response.ok) {
         return reject(response.statusText);
       }

       const blob = await response.blob();
       const url = await window.URL.createObjectURL(blob);

       window.open(url, '_blank');
       URL.revokeObjectURL(url); // This line was causing the problem
       resolve();
   })
   .catch(reject)