javascript - 从 AJAX 下载 PDF 文件成功回调

标签 javascript jquery ajax pdf post

当我尝试链接到已设置为呈现为 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 返回的结果是纯文本,并且可能导致将二进制文件下载为文本而不是 arrayBuffer 或 blob 时出现“超出范围”。 jQuery 不以任何方式支持responseType(据我所知)

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

这是使用新的 fetch 的示例API 和 FileSaver

function saveAs(blob, filename){
    if(navigator.msSaveOrOpenBlob)
        return navigator.msSaveOrOpenBlob(blob, filename)

    var link = document.createElement('a')
    link.href = window.URL.createObjectURL(blob)
    link.download = filename
    link.click()
}

fetch(myUrl, {
    method: 'post', 
    body: JSON.stringify(params)
    headers: {
        'Content-Type': 'application/json;charset=UTF-8'
    }
})
.then(res => res.blob())
.then(blob => saveAs(blob, 'PreviewProposalAsPdf.pdf'))


// EXAMPLE USING XHR
var req = new XMLHttpRequest
req.open('GET', myUrl, true)
req.responseType = 'blob'
req.onload = function() {
    saveAs(res.response, 'Dossier_' + new Date() + '.pdf')
}
req.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
req.send(JSON.stringify(params))

但是ofc,如果使用xhr + responseType = blob,会有更广泛的支持

你能做的最好的事情就是发送 content-disposition header 并制作附件 - 但这样你就不能使用 ajax...需要提交表单(可能来自 iframe)

关于javascript - 从 AJAX 下载 PDF 文件成功回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39498047/

相关文章:

javascript - 如何调试 jQuery Ajax 请求?

javascript - 创建具有以下外观的下拉菜单的最简单/最佳方法是什么(具有奇怪的边框并且需要动态)

javascript - 谷歌应用程序脚本将客户端变量推送​​到服务器

javascript 从事件监听器访问父级

php - 我似乎无法弄清楚为什么这个查询给我错误

javascript - Pjax/Ajax 片段在加载时返回 width/offsetWidth 为 0

javascript - 我可以完全停止使用 var 吗?

javascript - 将一些 html 和 js 写入 iframe,在 IE 中不起作用 :$ is not defined?

javascript - 取消选中复选框时 AJAX 不起作用

jquery - 如何使用 jquery 向页面 <head> 添加 CSS 类?