这是我的情况,我有一个运行PDF生成器的服务器,当我用一些参数提出请求时,它会给我一个PDF文件,PDF不会存储在它生成的服务器中运行时。
一切顺利,我可以在chrome的PDF查看器中打开PDF,但如果要下载文件,则会出现错误,如图所示。
因为Chrome转到原始网址来请求文件,但该文件不是服务器上的静态资源。
我不知道是否有人遇到过这个问题?
答案 0 :(得分:3)
Chrome内置的PDF查看器将通过PDF的原始网址下载pdf文件。因此,如果PDF是在服务器运行时生成的,并且如果它未存储在服务器中,则下载可能会失败。
请点击此处链接:https://productforums.google.com/forum/#!topic/chrome/YxyVToLN8ho
答案 1 :(得分:3)
每当您离开用于创建对象网址(window.URL.createObjectURL(...)
)的网站时,该对象将获得垃圾回收。所以你需要以某种方式保持对该对象的引用。
这适用于我们的Chrome,Firefox,Safari,iOS Safari& Android首先在功能强大的浏览器中显示PDF 在新标签中,然后允许下载(在IE中它只是开始下载):
function openPdfInNewTab(url,
postData,
description = 'Document',
filename = description + '.pdf') {
if (!window.navigator.msSaveOrOpenBlob) {
var tabWindow = window.open('', '_blank');
var a = tabWindow.document.createElement('a');
a.textContent = 'Loading ' + description + '..';
tabWindow.document.body.appendChild(a);
tabWindow.document.body.style.cursor = 'wait';
} else {
spinnerService.show('html5spinner');
}
$http.post(url, postData, {responseType: 'arraybuffer'})
.then(function showDocument(response) {
var file = new Blob([response.data], {type: 'application/pdf'});
if (window.navigator.msSaveOrOpenBlob) {
spinnerService.hide('html5spinner');
window.navigator.msSaveOrOpenBlob(file, filename);
} else {
tabWindow.document.body.style.cursor = 'auto';
var url = a.href = window.URL.createObjectURL(file);
a.click();
a.download = filename;
}
$timeout(function revokeUrl() {
window.URL.revokeObjectURL(url);
}, 3600000);
}, handleDownloadError);
}
我们一直在新的浏览器标签中打开PDF并遇到类似的问题。
对于我们来说,当我们使用window.URL.createObjectURL而不是显示PDF但不允许下载的tabWindow.URL.createObject时,它又开始工作了。
答案 2 :(得分:0)
只需附加一条评论:
我们在一个项目中遇到了同样的问题,仅在Chrome上。
经过认证的GET
请求将从API提取PDF作为附件,我们将通过window.createObjectURL(blob)
将其转发到浏览器查看器。
Network Error
是由于我们在打开PDF后调用了window.revokeObjectURL(url);
。当我们删除该行时,该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)