通过jQuery下载时获取空PDF



我正在尝试通过JavaScript/jQuery下载pdf文件。我的代码是:

function ShouldGeneratePdf() {
$.ajax({
url: "/Report/EmployeeReport",
type: 'POST',
data: {
EmployeeId: $('#EmployeeId').val()
},
cache: false,
async: false,
success: function (data) {
debugger;
//Convert the Byte Data to BLOB object.
var blob = new Blob([data], { type: "application/pdf" });
//Check the Browser type and download the File.
var isIE = false || !!document.documentMode;
if (isIE) {
window.navigator.msSaveBlob(blob, fileName);
} else {
var url = window.URL || window.webkitURL;
link = url.createObjectURL(blob);
var a = $("<a />");
a.attr("download", "testFile.pdf");
a.attr("href", link);
$("body").append(a);
a[0].click();
$("body").remove(a);
}
},
error: function () {
debugger;
}
});
}

上面的方法确实下载了pdf,但下载的文件是空的。知道我做错了什么吗?任何帮助都将不胜感激。

PS:PDF文件还包括图像。

在经历了一个非常沮丧的一周试图找出如何解决这个问题之后,我可以建议您检查以下四个基本点:

1.-如果您使用子域或完全不同的域,请检查服务器的CORS策略是否对您的网站请求开放。这取决于您的服务类型(我的是ASP.NET MVC(。

2.-我与我的Web App和Web API发生冲突(因为我从第一次开始就没有使用ASP.NET Core(,因此我无法正常使用fetch函数,但如果不是您的情况,请尝试按照这里的建议从您的客户端使用fetch API,因为它可以直接从请求中预期blob类型(您也可以尝试使用Axios或XMLHttpRequest方法(。

3.-(最重要的是(最终对我起作用的是在发送响应文件之前将服务器上的文件转换为Base64,然后用一个函数从客户端对其进行解码。跳过这一步只会抛出一个空白的PDF,即使我可以从Safari检查器预览它,并且它的所有字节都有一个完美的PDF响应,但这还不足以让浏览器正确下载它;所以试着先对它进行编码。

4.-最后记得在请求中定义最适合您需求的数据类型和内容类型。就我而言:

...
dataType: 'text',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
success: function(response) {
...

最新更新