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