我认为这对你不起作用的主要原因是 jQuery 不支持“blob”数据类型。
我做了一些研究,发现了一个如何让它与 jQuery 一起工作的例子:
http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/ http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
您需要包含博客文章中的 jQuery 插件,然后将 $.post 调用转换为 $.ajax 调用(使用 POST 方法),并指定传输数据类型为“二进制”(以加载插件)。
添加插件后,将代码更改为如下所示:
$.ajax({
method: "POST",
url: "/someroute",
dataType: 'binary' // USE THE PLUGIN
})
.then(function (data) {
console.log("Got the PDF file!");
// Do with the PDF data as you please.
var downloadLink = document.createElement('a')
downloadLink.target = '_blank'
downloadLink.download = 'new_pdf_haha.pdf'
var blob = new Blob([data], { type: 'application/pdf' })
var URL = window.URL || window.webkitURL
var downloadUrl = URL.createObjectURL(blob)
downloadLink.href = downloadUrl
document.body.append(downloadLink) // THIS LINE ISN'T NECESSARY
downloadLink.click()
document.body.removeChild(downloadLink); // THIS LINE ISN'T NECESSARY
URL.revokeObjectURL(downloadUrl);
})
.catch(function (err) {
console.error("An error occurred.");
console.error(err);
});
这里有一个完整的工作示例:
https://github.com/ashleydavis/pdf-server-example https://github.com/ashleydavis/pdf-server-example
请注意,我的服务器设置与您的不同,这对您来说可能是也可能不是问题。我已经包含了用于流式和非流式 PDF 文件下载的示例代码以进行比较 - 默认情况下使用流式传输,因为我认为这就是您想要的。
另请注意,似乎没有必要将合成链接添加到文档中,并且我已将这些行标记为不必要。
我还应该注意,最好使用 HTTP GET 而不是 HTTP POST 来完成此类操作。如果您这样做了,您可以将浏览器下载代码简化为以下内容:
var downloadLink = document.createElement('a');
downloadLink.target = '_blank';
downloadLink.download = 'new_pdf_haha.pdf';
downloadLink.href = "someroute";
document.body.append(downloadLink)
downloadLink.click()
document.body.removeChild(downloadLink);