当前位置: 首页 > 面试题库 >

从ajax响应下载pdf文件

孟开宇
2023-03-14
问题内容

我正在尝试使浏览器下载从ajax响应接收到的pdf文件。

受jquery ajax下载pdf文件启发,我模拟了如下单击/下载事件:

    var req = new XMLHttpRequest();
    req.open("POST", "/servicepath/Method?ids=" + ids, true);
    req.responseType = "blob";
    req.onreadystatechange = function () {
        if (req.readyState === 4 && req.status === 200) {
            var blob = req.response;
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = "PdfName-" + new Date().getTime() + ".pdf";
            link.click();
        }
    };
    req.send();

不幸的是,这仅适用于Chrome,不适用于Firefox + IE。当我尝试在最后两个浏览器中触发它时,没有任何反应。

由于从CMS继承,脚本和标记被放置在iframe中,但是我不确定这是否有影响。

关于如何针对所有现代浏览器进行优化的想法?


问题答案:

关于如何针对所有现代浏览器进行优化的想法?

是的,我可以为您提供在Windows 10上经过IE11,Firefox 47和Chrome 52测试的解决方案。目前,Microsoft
Edge尚无任何功能。

开始时,您需要区分是使用IE还是其他两种浏览器。这是因为在IE11上您可以使用:

window.navigator.msSaveBlob(req.response, "PdfName-" + new Date().getTime() + ".pdf");

对于其他两个浏览器,您的代码可在Chrome上运行,但不能在Firefox上运行,因为您没有将元素附加到文档正文中。

因此,更正后的代码是:

var req = new XMLHttpRequest();
req.open("POST", "/servicepath/Method?ids=" + ids, true);
req.responseType = "blob";
req.onreadystatechange = function () {
  if (req.readyState === 4 && req.status === 200) {

    // test for IE

    if (typeof window.navigator.msSaveBlob === 'function') {
      window.navigator.msSaveBlob(req.response, "PdfName-" + new Date().getTime() + ".pdf");
    } else {
      var blob = req.response;
      var link = document.createElement('a');
      link.href = window.URL.createObjectURL(blob);
      link.download = "PdfName-" + new Date().getTime() + ".pdf";

      // append the link to the document body

      document.body.appendChild(link);

      link.click();
    }
  }
};
req.send();


 类似资料:
  • 问题内容: 我想下载一个jQueryajax响应的pdf文件。Ajax响应包含pdf文件数据。。我的代码在下面给出,但是我总是得到一个空白的pdf。 问题答案: jQuery使用AJAX请求加载二进制数据时存在一些问题,因为它尚未实现某些HTML5 XHRv2功能 鉴于此,您拥有以下两种解决方案之一: 第一个解决方案是放弃JQuery并使用XMLHTTPRequest 与本地HTMLHTTPReq

  • 当我第一次调用方法时,它成功地下载了文件,但我得到了以下错误: https://madrasty.dev.ibtdi.work/public/reports/15287105135b1e4571f2596-new.pdf(函数)错误:responseSerializationFailed(AlamoFire.Aferror.ResponseSerializationFailureRereason.

  • 我的python3代码: 它将内容保存在metadat.pdf但那不是pdf的真正内容,它是这个html页面: 任何帮助,我如何才能保存文件的真实内容,而不是这个html?它应该是真正的pdf,当我下载它是jsut这个html页面 更新: 当我使用Python会话时,从服务器的一个NSWER:

  • 问题内容: 我有一个生成PDF的动作类。该适当地设定。 我 通过Ajax调用来称呼它。我不知道将流传输到浏览器的方法。我尝试了几件事,但没有任何效果。 上面给出了错误: 您的浏览器发送了该服务器无法理解的请求。 问题答案: 您不必为此使用Ajax。只是一个环节是不够的,如果你设置到服务器端代码。这样,如果您最关心的是父页面将保持打开状态(为什么您会为此而不必要地选择Ajax?)。此外,没有办法很好

  • 问题内容: 我想在浏览器中使用ajax和ActionResult下载文件。该文件已下载并从我的ActionResult返回。 我看到Http查询正常,并且在响应正文中看到了数据。问题是不建议将该文件保存在浏览器中。 一切似乎都很好。我在教程和论坛中看到的所有内容都和我一样,但我没有说过XD。我不明白我和其他人之间有什么区别。 这是我的ActionResult: 这是我的javascript: 谢谢

  • 问题内容: 我的GSP中有这个ajax调用: 这是我的控制器操作的代码块: 我从通过$ .Ajax方法从视图传递的数据中获取票证列表。比我将数据格式化为CSV格式,然后我想将数据导出为CSV文件,但没有任何反应。数据已发送到客户端,但是由于内容配置不正确,因此没有可供下载的文件。我想念什么?我试图做类似的事情: 并在控制器中生成纯字符串,但是那样我得到的文件没有扩展名是不可接受的。 我该如何实现?