2015-05-03 52 views
0

我试图用jquery的$ .post方法下载一个excel CSV文件,但我很难让它工作。使用jquery post MVC下载文件

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

我的jQuery的岗位职能如下:

$.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. 

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

我见过指导,显示此方法工作,但似乎有什么,我错过了停止下载工作。

回答

0

文件下载的工作方式与重定向类似。 Ajax方法(包括post)不处理重定向,只是按原样返回服务器结果。在你的情况下,一个文件流。

而不是从帖子中返回文件,这需要你对实际的文件流(而不是URL)做一些事情,只需要post方法在服务器上创建一个临时文件,然后返回一个URL到那个文件。

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

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

  • 数据时到期检查/所有的临时文件被创建的任何文件时,/请
  • 仅具有每用户可用1个临时下载文件名
+0

感谢您的回答,我确信我可以使用window.location下载它,但它似乎并没有像我想的那样工作(在试图找出几个小时=。=之后)。无论如何,而不是在服务器上创建一个文件,我将该值存储在会话中(按照本指南 - http://stackoverflow.com/questions/14138872/how-to-use-sessions-in-an-asp-net -mvc-4-application)并且现在可以完美下载。 – Hanho

+0

假设您只需将整个文件作为编码字符串传递,则“window.location”的大小限制非常小,因此永远不会实用。虽然会话*将会*工作,但实际上不推荐用于大型数据项目,并且在多个服务器上肯定不会很好地工作(例如,一个实际的生产环境中最少有2个服务器实例) –

+0

啊,对了,谢谢你的支持,当我们谈论大数据项时,我们会谈论大吗?超过1兆? 5 megs? 100megs?另外,您能否简要概述一下服务器实例的含义? (或关于这个的链接?) – Hanho