4

Chrome で AngularJS を使用して PDF をダウンロードできますが、これは最新の FireFox、Internet Explorer 11、または Edge では機能しないようです ( IE10でも機能しないと仮定します) 。誰かが意見を持っている場合、これがこれに最適なシムかどうかはわかりませんが、現在は機能していないようです. 念のため、応答タイプをblobandにしてみarraybufferましたが、違いはありません。

これはすべて、Blob URL の使用についてcaniuseが示していることに反論します。IE9以降、およびFFの最後の2つのバージョンでこれが機能している人はいますか?私が間違っていることを指摘できますか?

$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はこのソリューションを使用して機能しません.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...
            }
        }
    }
4

1 に答える 1

5

私はIE11とChromeの両方でこれを使用して成功しました:

function saveBlob(response, contentType, filename) {
    let blob = new Blob([response.arrayBuffer()], { type: contentType });
    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround
        window.navigator.msSaveBlob(blob, filename);
    } else {
        let URL = window.URL;
        let downloadUrl = URL.createObjectURL(blob);
        if (filename) {
            let a = document.createElement('a');
            if (typeof a.download === 'undefined') {
                window.location.href = downloadUrl;
            } else {
                a.href = downloadUrl;
                a.download = filename;
                document.body.appendChild(a);
                a.click();
            }
        } else {
            window.location.href = downloadUrl;
        }
        // cleanup
        setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); 
    }
}
于 2017-01-05T21:08:53.057 に答える