Skip to content

Instantly share code, notes, and snippets.

@anhphamt
Last active January 14, 2021 01:02
Show Gist options
  • Save anhphamt/840b7fc38f3976875aa2810f4f70c1b1 to your computer and use it in GitHub Desktop.
Save anhphamt/840b7fc38f3976875aa2810f4f70c1b1 to your computer and use it in GitHub Desktop.
Ajax post to download file as BLOB content
$.ajax({
    type: "POST",
    url: _url,
    xhrFields: {
        responseType: "blob" // to avoid binary data being mangled on charset conversion
    },
    success: function(blob, status, xhr) {
        // check for a filename
        var filename = "";
        var disposition = xhr.getResponseHeader(
            "Content-Disposition"
        );
        if (
            disposition &&
            disposition.indexOf("attachment") !== -1
        ) {
            var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
            var matches = filenameRegex.exec(disposition);
            if (matches != null && matches[1])
                filename = matches[1].replace(/['"]/g, "");
        }

        if (typeof window.navigator.msSaveBlob !== "undefined") {
            // IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed."
            window.navigator.msSaveBlob(blob, filename);
        } else {
            var URL = window.URL || window.webkitURL;
            var downloadUrl = URL.createObjectURL(blob);

            if (filename) {
                // use HTML5 a[download] attribute to specify filename
                var a = document.createElement("a");
                // safari doesn't support this yet
                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;
            }

            setTimeout(function() {
                URL.revokeObjectURL(downloadUrl);
            }, 100); // cleanup
        }
    }
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment