使用 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 方法