在ASP.NET MVC中下载动态生成的文件

Jon*_*ood 9 asp.net-mvc

我需要在ASP.NET MVC中实现文件下载.在网上搜索,我找到了这样的代码:

public ActionResult GetFile()
{
    return File(filename, "text/csv", Server.UrlEncode(filename));
}
Run Code Online (Sandbox Code Playgroud)

这很好,但我想动态创建此文件的内容.

我意识到我可以动态创建文件,然后使用上面的语法下载该文件.但是,如果我能直接将我的内容直接写入回复,那会不会更有效率?这可能在MVC中吗?

Jon*_*ood 14

这是我最终使用的代码的过度简化版本.它符合我的需求.

[HttpGet]
public ActionResult GetFile()
{
    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment; filename=myfile.csv");
    Response.ContentType = "text/csv";

    // Write all my data
    Response.Write(...);
    Response.End();

    // Not sure what else to do here
    return Content(String.Empty);
}
Run Code Online (Sandbox Code Playgroud)


kai*_*nsm 6

另一种解决方案是使用接受流的 File() 重载。

就我而言,我需要从控制器操作生成一个 csv,所以它有点像这样:

[HttpGet]
public ActionResult DownloadInvalidData(int fileId)
{
    string invalidDataCsv = this.importService.GetInvalidData(fileId);
    string downloadFileName = "error.csv";

    var stream = new MemoryStream();
    var writer = new StreamWriter(stream);

    writer.Write(invalidDataCsv);
    writer.Flush();
    stream.Position = 0;

    return File(stream, "text/csv", downloadFileName);
}
Run Code Online (Sandbox Code Playgroud)

请注意,在将 Stream 或 StreamWriter 传递给 File() 函数之前,不应将其丢弃,因为丢弃其中任何一个都会关闭流,使其无法使用。