Я могу загрузить PDF-файл с помощью AngularJS в Chrome, но, похоже, это не работает в последних версиях FireFox, Internet Explorer 11 или Edge (при условии, что это не работает и в IE10), и я знаю прокладка необходима для IE9. Не знаю, лучшая ли это прокладка для этого, если у кого-то есть мнение, но в настоящее время она, похоже, не работает. Я попробовал это с типом ответа blob
и arraybuffer
на всякий случай, если это имело значение, и это не так.
Все это противоречит тому, что caniuse указывает на использование URL-адресов BLOB-объектов. У кого-нибудь это работает в IE9 и выше, а также в последних двух версиях FF, и может указать, что я делаю неправильно?
$http({
url: '/api/v1/download',
method: 'GET',
responseType: 'blob' // or 'arraybuffer'
}).then(function (response) {
// Use the Blob object to create an object URL to download the file
var url = URL.createObjectURL(response.data);
// var url = URL.createObjectURL(new Blob([response], {type: 'application/pdf'})); // arraybuffer version
// Create an anchor to perform download, but don't append to the DOM
anchor.href = downloadUrl;
anchor.download = filename;
anchor.target = '_blank';
anchor.click();
URL.revokeObjectURL(downloadUrl);
anchor = null;
}).catch(function (reason) {
console.log('FAIL', reason);
});
ОБНОВЛЕНИЕ
В настоящее время лучший (единственный) ответ работает для IE10, 11, Edge, FF и продолжает работать с Chrome. IE9 не будет работать с этим решением, если у кого-то есть другой polyfill/shim/other/etc, а Safari не поддерживает атрибут загрузки, поэтому решение в выбранном ответе не работает в SPA, поскольку оно просто перенаправляет текущую страницу. поэтому в обоих этих случаях я просто оставил заглушки TODO.
Это обновление опубликованного ответа с дополнительной информацией, добавленной в комментарии для всех, кто может использовать или, надеюсь, добавить, чтобы IE9 и Safari работали должным образом:
function performDownload(blob, filename) {
// IE9 has no API for handling downloads using Blob objects, and doesn't support the download attribute
if(isIE() == 9) {
// TODO: polyfill/shim/other... change response type to?
}
// Only works for IE10 and up, including Edge
else if (typeof window.navigator.msSaveBlob !== 'undefined') {
// Provides a prompt to save the file to a location of users choice
window.navigator.msSaveBlob(blob, filename);
}
// Browsers that adhere to current standards can implement downloads
// using the Blob object with the download anchor attribute
// ---
// NOTE: Edge 13+ is compliant with both these standards, but Edge 12
// does not support the download anchor attribute so all versions
// have been grouped to use the propriety `msSaveBlob` method
else {
// Use the Blob object to create an object URL to download the file
var URL = window.URL;
var downloadUrl = URL.createObjectURL(blob);
var anchor = document.createElement('a');
if(angular.isDefined(anchor.download)) {
anchor.href = downloadUrl;
anchor.download = filename;
anchor.target = '_blank';
document.body.appendChild(anchor); // Required by Firefox
anchor.click();
// Release the existing object URL, and the anchor
$timeout(function () {
URL.revokeObjectURL(downloadUrl);
document.body.removeChild(anchor);
anchor = null;
}, 100);
}
else {
// TODO: Safari does not support the download anchor attribute...
}
}
}
<a>
добавляется кdocument.body
? Отменяете ли выBlob URL
до загрузки ресурса? - person guest271314   schedule 06.01.2017msSaveBlob
. Кроме того,application/octet-stream
по другой ссылке имеет известные проблемы в Safari, согласно caniuse. - person mtpultz   schedule 06.01.2017javascript
в дублирующемся вопросе не совпадает сjavascript
в текущем вопросе.javascript
в связанном вопросе добавляет элемент<a>
кdocument.body
, как указано в первом комментарии.application/octet-stream
подход - это не только ответ или подход, описанный во второй ссылке. - person guest271314   schedule 06.01.2017javascript
по адресу stackoverflow.com/a/31763030 не возвращает ожидаемый результат? - person guest271314   schedule 06.01.2017window.navigator.msSaveBlob
. Единственная проблема заключается в том, чтоmsSaveBlob
нет в IE9, и я не могу найти никакого решения/полифилла/прокладки для IE9, который, к сожалению, все еще находится на нашем радаре разработки :( - person mtpultz   schedule 06.01.2017