使用 jquery post 的 MVC 下载文件

Posted

技术标签:

【中文标题】使用 jquery post 的 MVC 下载文件【英文标题】:MVC download file using jquery post 【发布时间】:2015-05-03 09:31:00 【问题描述】:

我正在尝试使用 jquery 的 $.post 方法下载一个 excel CSV 文件,但我无法让它工作。

我可以看到服务器正在创建文件并将其发送回客户端,但之后我无法实际下载文件。

我的 jquery post 函数如下所示:

$.post("/GenerateFile",  id: id, startDate: startDate, endDate: endDate , function (data) 

    window.location = data;

).fail(function (XMLHttpRequest, textStatus, errorThrown) 

);

我的服务器端函数如下所示:

public async Task<ActionResult> GenerateFile(string id, string startDate, string endDate)

    try
    
        // My logic to create the file here, this is of type Task<MemoryStream>
        var outputFile = await CreateFile(sDate, eDate);

        return File(outputFile, "text/comma-separated-values", "Download.csv");
    
    catch (Exception e)
    
        return new HttpStatusCodeResult(400, e.Message);
    

当此数据返回客户端时,它会尝试使用 CSV 文件中的数据(如 URL 链接中所示)导航到新页面并显示消息

Bad Request - Invalid URL

HTTP Error 400. The request URL is invalid.

文件生成本身没有问题,因为我可以将文件本地创建到磁盘上,只是在我尝试使用浏览器下载它时。

我已经看到显示此方法有效的指南,但我似乎缺少一些东西,导致下载无法正常工作。

【问题讨论】:

【参考方案1】:

文件下载的工作方式类似于重定向。包括 post 在内的 Ajax 方法不处理重定向,而是按原样返回服务器结果。在您的情况下是文件流。

与其从 post 中返回文件,这需要您对实际的文件流(而不是 URL)做一些事情,只需获取 post 方法在服务器上创建一个临时文件,然后返回一个指向该文件的 URL .

然后当你将window.location设置为文件URL时,它会根据你的需要下载。

这是一种非常标准的方法,但之后您需要处理删除临时文件。策略包括:

在创建/请求任何文件时对任何/所有临时文件进行数据时间到期检查 每个用户只能使用 1 个临时下载文件名

【讨论】:

感谢您的回答,我确信我可以使用 window.location 下载它,但它似乎并没有像我想象的那样工作(在尝试了几个小时之后 =.= )。无论如何,我没有在服务器上创建文件,而是将值存储在会话中(根据本指南 - ***.com/questions/14138872/…),现在可以完美下载。 假设您可以将整个文件作为编码字符串传递,window.location 的大小限制非常小,因此这永远不会实用。虽然会话工作,但对于大型数据项确实不建议这样做,并且肯定不会在多个服务器上正常工作(例如,具有最少 2 个服务器实例的真实生产环境) 啊,对了,谢谢提醒,当您说大数据项时,我们指的是多大?超过 1 兆? 5 兆? 100 兆?另外,您能否简要介绍一下服务器实例的含义? (或有关此的链接?)

以上是关于使用 jquery post 的 MVC 下载文件的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC 5 控制器中使用 POST 从 dotnet Core Web API 下载文件

如何使用 ASP.NET MVC Rest API 调用和 jQuery Ajax 下载文件

ruby 使用带伪装ajax的jquery / POST请求文件下载请求

使用带有 mvc 的 jQuery 数据表服务器端处理。序列化条件表单并将此参数添加到 $ajax.post 方法

Asp.net Mvc:Jquery post 数组 + 防伪令牌

使用 MVC、C# 和 jQuery 导出为 CSV