【问题标题】:MVC download file using jquery post使用 jquery post 的 MVC 下载文件
【发布时间】: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.

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

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

【问题讨论】:

    标签: jquery asp.net-mvc


    【解决方案1】:

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

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

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

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

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

    【讨论】:

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