【问题标题】:Stream Generated File to Browser without Writing to File System将生成的文件流式传输到浏览器而不写入文件系统
【发布时间】:2014-01-31 03:02:37
【问题描述】:

我知道我可以使用以下代码从控制器操作返回文件:

public ActionResult SomeAction()
{
    return File(PathToTheFile);
}

还有一个接受 Stream 而不是文件路径的重载。

在我的例子中,我根据数据库查询动态创建了一个 CSV 文件。将该 CSV 文件直接写入响应并将响应视为文件会更简单。有可能这样做吗?怎么样?

编辑

我假设我将写入某种流,但哪种流以及谁负责处理它?

【问题讨论】:

  • 所以用户永远不需要下载 CSV 文件?为什么要创建 CSV 文件(或任何文件)?只需查询数据库并在页面上向用户显示该数据(按照您想要的方式格式化)
  • @rwisch45: 文件应该下载了,我只是暂时不想写到文件系统中。

标签: asp.net-mvc


【解决方案1】:

编辑:

当您动态创建输出并希望避免创建文件和内存流以提高性能并避免额外的 I/O 时,一个简单的解决方案是直接写入 Http Response。以下代码是一个适用于我的示例。您可以对数据使用相同的方法。

public ActionResult getFile()
    {
        Response.AddHeader("Content-Disposition", "attachment; filename=myVFile.csv");
        Response.ContentType = "text/csv";


        //sample data 
        string[] data = { "-4", "-3", "-2", "-1", "0", "1", "2", "3" };


        //Query data with LINQ  - This can be done in diffrent ways 
        (from item in data
         where
            //Some conditions
            item != "-4"
         select
         //Select whatever you want to be in the output 
         item
         )
        .ToList()
        .ForEach(
              //Write items from your LINQ Query to HTTP Response 
               item => Response.Write(item + ",")
        );

        //You can use a foreach loop instead of chaining ForEach in LINQ as above 


        Response.End();

        return Content(null);
    }

【讨论】:

  • CreateMyFile 如何写入流?什么样的流?流是如何处理的?
  • 如果我要将文件流式传输到响应,我将使用 MemoryString 如下: private static Stream CreateMyFile() { string filename = "myfile.csv";字节[] 内容 = File.ReadAllBytes(文件名);内存流毫秒 = 新的内存流(); ms.Write(内容, 0, (int)content.Length); ms.位置 = 0;返回毫秒; } 您可以替换行 byte[] content = File.ReadAllBytes(filename) 以从您的数据库或您希望的任何其他方式创建内容....
  • 但这需要 a) 实际上在磁盘上有一个文件(试图避免这种情况),并且 b) 在将所有字节流出之前将它们读入内存。
  • 您如何创建您希望作为可下载文件流式传输以响应响应的最终内容?是通过集合还是 LINQ 查询进行迭代?您能否在此处粘贴您的内容创建方法,以便帮助提出更好的解决方案。
  • 我迭代了一个 Linq 查询。我可以将链接查询的结果写入文件流,然后将该文件作为 ActionResult 返回。但是,我试图避免写入该文件。
猜你喜欢
  • 1970-01-01
  • 2010-10-11
  • 2016-08-02
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
相关资源
最近更新 更多