从 Ajax 调用控制器操作时无法下载生成的 PDF [重复]

Posted

技术标签:

【中文标题】从 Ajax 调用控制器操作时无法下载生成的 PDF [重复]【英文标题】:Unable to download generated PDF when controller action is called from Ajax [duplicate] 【发布时间】:2019-04-19 16:43:47 【问题描述】:

我正在从控制器返回 FilestreamResult 我尝试了 jquery 和 ajax 两种方式,但无法成功从控制器下载 pdf/xlsx 文件。

控制器:

    var filestream = new FileStream(pdfoutputpath + ".pdf", FileMode.Open);
                return new FileStreamResult(filestream, "application/pdf");

使用jquery查看代码:

function downloadpdffile(id) 
                $(".popup-overlay, .popup-content").removeClass("active");
                var url = "/WorkInstructions/WorkinstructionDownload";
                $.get(url,  id: id, fileformat: 2 , function () 

                );
            

使用 ajax:

 function downloadpdffile(id) 
                $(".popup-overlay, .popup-content").removeClass("active");
                $.ajax(
                    url: "/WorkInstructions/WorkinstructionDownload",
                    cache: false,
                    type: "GET",
                    data:  id: id, fileformat: 2 ,
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json',
                    success: function () 

                    

                );

【问题讨论】:

如果将 ajax 更改为 POST 会发生什么?另外,您的控制器方法是如何装饰的? HttpGet, HttpPost 等。调用时你的控制器方法是否被命中?将错误回调添加到您的 ajax 请求中,并在成功和错误回调函数的主体中放置一些内容,然后查看命中的是哪一个,如果命中错误,您可以从 XHR 对象中获取一些信息。 你能展示你完整的控制器代码吗? 是否有必要使用 ajax 或者您只想下载该 pdf。还是 xls 文件? 如果您需要通过ajax 接收文件,我会参考这篇 SO 帖子 (***.com/questions/4545311/…) 【参考方案1】:

如果您的控制器没有问题,您可以使用 window.open 函数来完成您的任务。我在我的项目中使用了相同的技术。

var downloadURL='@Url.Action("WorkinstructionDownload", "WorkInstructions", new  id = id, fileformat = 2)'
window.open(downloadURL)

【讨论】:

【参考方案2】:

尝试将其放入您的 ajax 调用的 success 函数中:

success: function()
    window.location = '@Url.Action("WorkinstructionDownload", "WorkInstructions", new  id = id, fileformat = 2)';

虽然我不认为 ajax 在这里提供任何价值,除非我遗漏了什么。您可以轻松获取我在上面发布的 success 函数的内容,并将其完全放在 ajax 调用之外(并删除 ajax 调用)。或者您可以简单地执行以下操作并完全删除脚本:

<a href="@Url.Action("WorkinstructionDownload", "WorkInstructions", new id = id, fileformat = 2 )">Download Form</a>

【讨论】:

好吧,感谢你的工作,但我试过它不起作用。 我已经将我列出的两个选项的用例放在一起,它们不使用 ajax 并且它们正在工作。你能提供更多关于出了什么问题的信息吗?您是否收到错误消息?如果这不起作用,我怀疑您的控制器操作有问题。在这种情况下,您需要将整个控制器操作发布到您的问题中 现在我找到了另一个解决方案并且它正在工作,我自定义创建ancor标签 并从js调用并根据需要工作。

以上是关于从 Ajax 调用控制器操作时无法下载生成的 PDF [重复]的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用Ajax从远程服务器下载文件,而Codeigniter无法正常工作

Ajax 调用未从 ActiveRecord 返回最新数据

从 Ajax 下载文件(有点)

从按钮单击调用MVC Razor Ajax

使用ajax将@Model从视图发送到控制器

如何使用 jQuery Ajax 调用从 ASP.NET Web Api 下载 CSV 文件