使用 jquery ajax 下载 pdf 文件

IT技术 javascript jquery ajax pdf
2021-01-23 23:46:31

我想下载 jquery ajax 响应的 pdf 文件。Ajax 响应包含 pdf 文件数据。我试过这个解决方案我的代码在下面给出,但我总是得到一个空白的 pdf。

$(document).on('click', '.download-ss-btn', function () {

    $.ajax({
        type: "POST",
        url: 'http://127.0.0.1:8080/utils/json/pdfGen',
        data: {
            data: JSON.stringify(jsonData)
        }

    }).done(function (data) {
        var blob = new Blob([data]);
        var link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download = "Sample.pdf";
        link.click();
    });


});
4个回答

jQuery 使用 AJAX 请求加载二进制数据时存在一些问题,因为它还没有实现一些 HTML5 XHR v2 功能,请参阅此增强请求和此讨论

鉴于此,您有以下两种解决方案之一:

第一种解决方案,放弃JQuery,使用XMLHTTPRequest

使用本机 HTMLHTTPRequest,这是执行您需要的代码

  var req = new XMLHttpRequest();
  req.open("GET", "/file.pdf", true);
  req.responseType = "blob";

  req.onload = function (event) {
    var blob = req.response;
    console.log(blob.size);
    var link=document.createElement('a');
    link.href=window.URL.createObjectURL(blob);
    link.download="Dossier_" + new Date() + ".pdf";
    link.click();
  };

  req.send();

第二种解决方案,使用jquery-ajax-native插件

该插件可以在这里找到并且可以用于 JQuery 中缺少的 XHR V2 功能,这里是一个示例代码如何使用它

$.ajax({
  dataType: 'native',
  url: "/file.pdf",
  xhrFields: {
    responseType: 'blob'
  },
  success: function(blob){
    console.log(blob.size);
      var link=document.createElement('a');
      link.href=window.URL.createObjectURL(blob);
      link.download="Dossier_" + new Date() + ".pdf";
      link.click();
  }
});
InvalidStateError:无法从“XMLHttpRequest”读取“responseText”属性:仅当对象的“responseType”为“”或“text”(为“blob”)时,才能访问该值。
2021-03-13 23:46:31
这正是我所需要的。xhrFields: { responseType: 'blob' },
2021-03-14 23:46:31
太感谢了!
2021-03-15 23:46:31
效果很好,但我发现你需要 window.navigator.msSaveBlob(blob, filename); 如@anonymous 所示,使其在 IE11 中正常工作。
2021-03-23 23:46:31
要使其在 Firefox 中工作,您必须添加“document.body.appendChild(link);” 在点击链接之前:)
2021-04-03 23:46:31

我是新手,大部分代码来自谷歌搜索。我使用下面的代码下载了我的 pdf 文件(试错游戏)。感谢您提供上面的代码提示 (xhrFields)。

$.ajax({
            cache: false,
            type: 'POST',
            url: 'yourURL',
            contentType: false,
            processData: false,
            data: yourdata,
             //xhrFields is what did the trick to read the blob to pdf
            xhrFields: {
                responseType: 'blob'
            },
            success: function (response, status, xhr) {

                var filename = "";                   
                var disposition = xhr.getResponseHeader('Content-Disposition');

                 if (disposition) {
                    var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
                    var matches = filenameRegex.exec(disposition);
                    if (matches !== null && matches[1]) filename = matches[1].replace(/['"]/g, '');
                } 
                var linkelem = document.createElement('a');
                try {
                                           var blob = new Blob([response], { type: 'application/octet-stream' });                        

                    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 = downloadUrl;
                            } else {
                                a.href = downloadUrl;
                                a.download = filename;
                                document.body.appendChild(a);
                                a.target = "_blank";
                                a.click();
                            }
                        } else {
                            window.location = downloadUrl;
                        }
                    }   

                } catch (ex) {
                    console.log(ex);
                } 
            }
        });
你是我的英雄。谢谢 :)
2021-03-12 23:46:31
5 小时和大约 30 个其他属性添加到 .ajax({})...xhrFields 修复了它。太感谢了!
2021-04-09 23:46:31

你可以很容易地用 html5 做到这一点:

var link = document.createElement('a');
link.href = "/WWW/test.pdf";
link.download = "file_" + new Date() + ".pdf";
link.click();
link.remove();

对于那些寻求更现代方法的人,您可以使用fetch API. 以下示例显示了如何下载PDF文件。使用以下代码可以轻松完成。

fetch(url, {
    body: JSON.stringify(data),
    method: 'POST',
    headers: {
        'Content-Type': 'application/json; charset=utf-8'
    },
})
.then(response => response.blob())
.then(response => {
    const blob = new Blob([response], {type: 'application/pdf'});
    const downloadUrl = URL.createObjectURL(blob);
    const a = document.createElement("a");
    a.href = downloadUrl;
    a.download = "file.pdf";
    document.body.appendChild(a);
    a.click();
})

我相信这种方法比其他XMLHttpRequest解决方案更容易理解此外,它具有与该jQuery方法类似的语法,无需添加任何额外的库。

当然,我建议检查您正在开发的浏览器,因为这种新方法不适用于 IE。您可以在以下 [链接][1] 中找到完整的浏览器兼容性列表。

重要提示:在本例中,我将一个 JSON 请求发送到侦听给定url. url必须设置,在我的例子中,我假设你知道这部分。此外,请考虑您的请求工作所需的标头。由于我发送的是 JSON,因此我必须添加Content-Type标头并将其设置为application/json; charset=utf-8,以便让服务器知道它将接收的请求类型。

数据未定义!但是当我删除第 2 行时,它起作用了。
2021-03-27 23:46:31
那是因为您需要定义它,除非您的请求不需要正文。
2021-03-30 23:46:31