通过 jQuery 下载时获取空 PDF

Posted

技术标签:

【中文标题】通过 jQuery 下载时获取空 PDF【英文标题】:Getting empty PDF while downloading through jQuery 【发布时间】:2021-07-07 11:34:59 【问题描述】:

我正在尝试通过 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】:

经过一个非常令人沮丧的一周试图弄清楚如何解决这个问题,我可以建议你检查以下三个基本点:

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

2.- 我的 Web App 和我的 Web API 有冲突(因为我从一开始就没有使用 ASP.NET Core),所以我不能正常使用我的fetch 函数,但是如果不是您的情况,请尝试使用来自您的客户端 as suggested here 的 fetch API,因为它可以预期 直接来自请求的 blob 类型(您也可以尝试使用 Axios 或XMLHttpRequest 接近)。

3.-(最重要)最终对我有用的是在发送响应文件之前将文件 from the server 转换为 Base64,然后使用函数将 decode it from the client 转换为 Base64。即使我可以从 Safari 检查器预览它并且所有字节都具有完美的 PDF 响应,跳过这一步只会抛出一个空白 PDF,但这还不足以让浏览器正确下载它;所以先尝试编码。

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

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

【讨论】:

以上是关于通过 jQuery 下载时获取空 PDF的主要内容,如果未能解决你的问题,请参考以下文章

JQuery Ajax 调用 PDF 文件下载

前端通过ajax获取base64转blob下载PDF方法

如何使用 JQuery 禁用 pdf 文件下载选项?

使用jquery给网站添加下载进度显示

WCF REST用jquery下载pdf

《JQuery参考手册》高清pdf下载链接