Загрузка PDF как Blob не работает на Chrome iOS
В моем приложении Angular 7 у меня есть следующий код для загрузки PDF на различных платформах.
this.http.get('/api/url', {responseType: 'blob'}).pipe(map(res => {
return {
filename: 'filename.pdf',
data: res
};
}))
.subscribe(
res => {
const fileBlob = new Blob([res.data], {type: 'application/pdf'});
if (navigator && navigator.msSaveBlob) { // IE10+
navigator.msSaveBlob(fileBlob, res.filename);
} else if (navigator.userAgent.match('CriOS')) { // iOS Chrome
const reader = new FileReader();
reader.onloadend = () => {
window.location.href = reader.result.toString();
};
reader.readAsDataURL(fileBlob);
} else if (navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPhone/i)) { // iOS Safari and Opera
const url: string = URL.createObjectURL(fileBlob);
window.location.href = url;
} else {
const url: string = URL.createObjectURL(fileBlob);
const a: any = document.createElement('a');
document.body.appendChild(a);
a.setAttribute('style', 'display: none');
a.href = url;
a.download = res.filename;
a.click();
URL.revokeObjectURL(url);
a.remove();
}
}
);
Загрузка отлично работает на всех платформах, кроме Chrome iOS. В основном я следовал по этой ссылке и нескольким другим подобным ссылкам.
Я также пробовал следующие случаи для Chrome iOS
const reader = new FileReader();
reader.onloadend = () => {
window.open(reader.result.toString());
};
reader.readAsDataURL(fileBlob);
Также заменено onloadend
с onload
выше и пробовал оба пути. Плюс я попробовал также с кодом для Safari
, но это также не удалось.
Есть идеи, что мне здесь не хватает?
0 ответов
Удаление пользовательской проверки Chrome IOS работает для меня:
...subscribe(response => {
const file = new Blob([response.body], {type: 'application/pdf'});
const fileURL = (window.URL || window['webkitURL']).createObjectURL(file);
const fileName = 'Whatever.pdf';
const downloadLink = document.createElement('a');
downloadLink.href = fileURL;
downloadLink.download = fileName;
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
})