ie11 Downloading Base64 documents

后端 未结 4 688
一向
一向 2020-12-11 02:19

I have tried pretty much everything at this point and I cannot get anything to work in ie.

I need ie to download base64 documents from an attachment panel. I have n

4条回答
  •  囚心锁ツ
    2020-12-11 02:46

    Some time ago I've coined this function to make ("offer/initialize") a download of an xlsx or csv content accepting both a Blob or a base64 string:

    // Initializes a file download of a provided content
    //
    // Not usable outside browser (depends on window & document)
    //
    // @param {Blob|base64} cont File content as blob or base64 string
    // @param {string} ftype File type (extension)
    // @param {string} [fname='export.' + ftype] File name
    // @param {string} [mime='application/zip'] File mime type
    // @returns {void}
    function makeFileDownload(cont, ftype, fname, mime) {
        if (!fname) fname = 'export.' + ftype;
        if (!mime) mime = ftype === 'csv' ? 'text/csv' : 'application/zip'; // or 'application/vnd.ms-excel'
    
        if (Object.prototype.toString.call(cont) === '[object Blob]'
                && window.navigator && window.navigator.msSaveBlob) {
            window.navigator.msSaveBlob(cont, fname);
        }
        else {
            var downloadLink = document.createElement('a');
            downloadLink.download = fname;
            downloadLink.href = typeof cont === 'string'
                ? 'data:' + mime + ';base64,' + cont
                : window.URL.createObjectURL(cont);
            downloadLink.onclick = function(e) { document.body.removeChild(e.target); };
            downloadLink.style.display = 'none';
            document.body.appendChild(downloadLink);
            downloadLink.click();
        }
    };
    

    This should be able to accept both Blob and base64 string - you should get the idea how it's being done for either a Blob and a base64 string from the if/else block.

    If passing it base64 string is problematic just convert it to a Blob first (as suggested for example in this SO question, this answer is specifically aimed at IE11). Adjust the mime defaults according to your expected usage.

    I suppose you already have the content (Blob/base64), keep your original link (which I suppose is to be clicked by an user) a plain link or rather a button (i.e. without the download/href attributes), attach it a click event handler where you'll call the function and it should initialize the download for you:

    document.querySelector('#originalLink').addEventListener('click', function () {
        makeFileDownload(content, extension, filename, mimetype);
    });
    

提交回复
热议问题