Chrome PDF Viewer не может загрузить файл
Вот моя ситуация: у меня есть сервер, на котором работает генератор PDF, когда я делаю запрос с некоторыми параметрами, он возвращает мне файл PDF, PDF не сохраняется на сервере, который он генерирует во время выполнения.
Все идет хорошо, я могу открыть PDF в Chrome PDF Viewer, но если хотите загрузить файл, произошла ошибка, как показано на рисунке.
Потому что Chrome перейти к исходному URL, чтобы запросить файл, но файл не является статическим ресурсом на сервере.
Я не знаю, сталкивался ли кто-нибудь с этой проблемой?
2 ответа
Каждый раз, когда вы покидаете веб-сайт, который вы использовали для создания объекта URL (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 вместо tabWindow.URL.createObject, который отображал PDF, но не разрешал загрузку.
Встроенное средство просмотра PDF Chrome загрузит файл PDF через исходный URL-адрес PDF. Таким образом, если PDF создается во время выполнения сервера и если он не хранится на сервере, загрузка может завершиться неудачно.
см. ссылку здесь: https://productforums.google.com/forum/
Просто в качестве дополнительного комментария:
У нас была такая же проблема в проекте, только в Chrome.
Заверенные GET
запрос будет получать PDF как вложение из API, и мы будем пересылать его через window.createObjectURL(blob)
в браузере просмотра.
Network Error
был вызван нами window.revokeObjectURL(url);
после открытия PDF. Когда мы удалили эту строку, капля не была собрана мусором сразу после открытия.
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)