Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从AJAX成功后回调下载PDF文件_Javascript_Jquery_Ajax_Pdf_Post - Fatal编程技术网

Javascript 从AJAX成功后回调下载PDF文件

Javascript 从AJAX成功后回调下载PDF文件,javascript,jquery,ajax,pdf,post,Javascript,Jquery,Ajax,Pdf,Post,当我尝试链接到已设置为呈现为PDF文档的数据生成文件时,这可以在新窗口中打开PDF文档,但仅适用于小数据集: window.open(myUrl + params, "_blank", "menubar=no,status=no"); 我需要它来为这样的东西工作,这样我就可以使我的PDF与更大的数据集兼容。我尝试在ajax请求的数据部分传递参数,但它仅对PDF文档无效。它适用于Word和Excel文档。当我尝试与PDF相同的操作时,它会将下载返回到损坏的PDF对象 $.ajax({ ty

当我尝试链接到已设置为呈现为PDF文档的数据生成文件时,这可以在新窗口中打开PDF文档,但仅适用于小数据集:

window.open(myUrl + params, "_blank", "menubar=no,status=no");
我需要它来为这样的东西工作,这样我就可以使我的PDF与更大的数据集兼容。我尝试在ajax请求的数据部分传递参数,但它仅对PDF文档无效。它适用于Word和Excel文档。当我尝试与PDF相同的操作时,它会将下载返回到损坏的PDF对象

$.ajax({
   type:"POST",
   async:true,
   url: myUrl,
   data: params,
   success: function(result,status,jqhxr) {                 
         var blob=new Blob([result]);
       var link=document.createElement('a');
       link.setAttribute('target','_blank');
       link.href=window.URL.createObjectURL(blob);
       link.download="PreviewProposalAsPdf.pdf";
       link.click();                    
   }
});
我需要做什么才能正确呈现PDF?理想情况下,我希望在新窗口中直接导航到PDF页面,但我会选择可点击的文件下载。如果可能,请直接发布完整的解决方案。我在这上面花了很多时间,现在时间不多了

我在其他问题上寻找解决方案,但没有一个有效。在某些情况下,我已经尝试的是作为解决方案发布的。请帮忙


谢谢

使用jQuery ajax得到的结果是纯文本,可能会导致将二进制文件作为文本而不是数组缓冲区或blob下载时“超出范围”。jQuery不以任何方式支持responseType(据我所知)

因此,您需要依靠xhr或fetch将其作为blob来获取正确的内容。否则,您将获得损坏的数据

下面是一个使用新api和

但是,如果您使用xhr+responseType=blob,那么ofc将获得更广泛的支持


您可以做的最好的事情就是发送内容处置头并制作一个附件-但是您不能使用ajax。。。需要提交表单(可能来自iframe)

这是正确答案,无需使用SaveAs功能:

var req = new XMLHttpRequest();
req.open("POST", myUrl, true);

req.responseType = "blob";

req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.send(data);

req.onreadystatechange = function() {//Call a function when the state changes.
    if(req.readyState == 4 && req.status == 200) {
        console.log(req.responseText);
    }
}

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();
};

最终它解决了我的问题。谢谢你,永无止境。

你没有将参数作为body发布,而是在url中使用了它们。请参阅我更新的示例
var req = new XMLHttpRequest();
req.open("POST", myUrl, true);

req.responseType = "blob";

req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.send(data);

req.onreadystatechange = function() {//Call a function when the state changes.
    if(req.readyState == 4 && req.status == 200) {
        console.log(req.responseText);
    }
}

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();
};