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

Javascript 使用ajax发布复杂数据并在新窗口中打开返回的PDF,javascript,jquery,.net,ajax,pdf,Javascript,Jquery,.net,Ajax,Pdf,我需要使用jqueryajax将复杂而敏感的数据对象(嵌套对象、数组和个人识别信息)发布到我的服务器上,在服务器上生成PDF并返回给客户端。然后,客户端浏览器应在新窗口中打开PDF 由于数据的性质,请求既不能也不应该是编码的URL——它必须将数据作为JSON体包含 关于这个主题的其他问题/答案没有解决我的问题,或者没有完全解决问题。解决方案 将正文中的数据作为JSON发布 将响应的预期内容类型设置为arraybuffer(在客户端和服务器上) 请求成功完成后,将响应转换为Blob 创建指向Blo

我需要使用jqueryajax将复杂而敏感的数据对象(嵌套对象、数组和个人识别信息)发布到我的服务器上,在服务器上生成PDF并返回给客户端。然后,客户端浏览器应在新窗口中打开PDF

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


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

解决方案

  • 将正文中的数据作为JSON发布
  • 将响应的预期内容类型设置为
    arraybuffer
    (在客户端和服务器上)
  • 请求成功完成后,将响应转换为
    Blob
  • 创建指向
    Blob
    的对象url,并在新窗口中打开它
  • 注释

    • JQuery ajax必须使用
      arraybuffer
      内容类型
      ,因此必须使用基本JavaScript
      xhr
      (如果没有任何其他选项)
    • Internet Explorer有自己的处理和显示
      Blob
      的功能,因此需要特殊情况
    • 不包括IE9
    代码
    RequestPdf=函数(url、数据){
    var request=new XMLHttpRequest(),文件,fileURL;
    打开(“POST”,url);
    setRequestHeader(“内容类型”,“应用程序/json;字符集=UTF-8”);
    request.responseType=“arraybuffer”;
    请求发送(数据);
    request.onreadystatechange=函数(){
    if(request.readyState==4&&request.status==200){
    file=newblob([request.response],{type:'application/pdf'});
    if(window.navigator&&window.navigator.msSaveOrOpenBlob){//IE
    window.navigator.msSaveOrOpenBlob(文件);
    }否则{
    fileURL=URL.createObjectURL(文件);
    window.open(fileURL);
    }
    }
    };
    
    };
    .responseType
    设置为
    “arraybuffer”
    的目的是什么,其中
    arraybuffer
    然后转换为
    Blob
    createObjectUrl
    仅将
    Blob
    (或
    文件
    )作为输入参数。如果服务器以
    内容类型响应:application/PDF
    header
    ,则“生成PDF并返回到客户端”,是否可以使用responseType=“blob”
    ?响应没有
    内容类型:application/pdf
    标题集?响应实际上有
    内容类型:arraybuffer
    集。不过,我没有尝试直接将其设置为
    blob
    。您的建议可能会更直接地解决这方面的问题。另请参见,