使用ajax发布复杂数据并在新窗口中打开返回的PDF

时间:2016-12-30 04:29:21

标签: javascript jquery .net ajax pdf

我需要使用JQuery ajax将复杂且敏感的数据对象(嵌套对象,数组和个人身份信息)发布到我的服务器,在那里生成PDF并将其返回给客户端。然后,客户端浏览器应在新窗口中打开PDF。

由于数据的性质,请求既不能也不应该是编码的URL - 它必须将数据包含为JSON主体。

关于这个问题的其他问题/答案并没有解决我的问题或者没有完全解决问题。

1 个答案:

答案 0 :(得分:1)

<强>解决方案

  1. 将正文中的数据作为JSON进行POST。
  2. 将响应的预期Content-Type设置为arraybuffer(在客户端和服务器上)。
  3. 请求成功完成后,将响应转换为Blob
  4. 创建Blob的对象网址,然后在新窗口中打开它。
  5. 备注

    • JQuery ajax does not support arraybuffer Content-Type因此必须使用基本JavaScript xhr(如果您没有其他选项)。
    • Internet Explorer具有处理和显示Blob的功能,因此需要特殊情况。
    • Supported browsers不包含IE9

    <强>代码

    &#13;
    &#13;
    RequestPdf = function (url, data) {
        var request = new XMLHttpRequest(), file, fileURL;
        request.open("POST", url);
        request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        request.responseType = "arraybuffer";
        request.send(data);
        request.onreadystatechange = function () {
            if (request.readyState === 4 && request.status === 200) {
                file = new Blob([request.response], { type: 'application/pdf' });
                if (window.navigator && window.navigator.msSaveOrOpenBlob) { // IE
                    window.navigator.msSaveOrOpenBlob(file);
                } else {
                    fileURL = URL.createObjectURL(file);
                    window.open(fileURL);
                }
            }
        };
    };
    &#13;
    &#13;
    &#13;