【问题标题】:How do I create Csv in memory and return it to client?如何在内存中创建 Csv 并将其返回给客户端?
【发布时间】:2021-06-22 15:32:15
【问题描述】:

如何在内存中创建一个 csv 文件并将其返回为 FileStreamResult? 我尝试写信给memorystream,然后用FileStreamResult 将其返回,但我总是收到错误ObjectDisposedException: Cannot access a closed Stream.。我尝试将 leaveopen 设置为 true 并像告诉 here 那样手动处理,但我仍然遇到同样的错误。

[HttpGet]
    public FileStreamResult GetData()
    {
        var myResult = DataGetter.GetData().ToList();
        using var memStream = new MemoryStream();
        var writer = new StreamWriter(memStream, Encoding.UTF8, 1024, true);
        var csv = new CsvWriter(writer, CultureInfo.InvariantCulture,true);
        csv.WriteRecords(myResult );
        var fileStreamResult = new FileStreamResult(memStream, "text/csv");
        csv.Dispose();
        writer.Dispose();
        return fileStreamResult;
    }

【问题讨论】:

  • csv.Dispose(); 你在这里处理它,所以在返回之前删除此行。另外,请记住流实现了“IDisposable”,因此请记住将它们包含在using 块中。
  • 这能回答你的问题吗? Using CSVHelper to output stream to browser
  • 您需要写入 ROW 数据,并在每行末尾返回一个 (WriteLine)。然后在添加新行之前从文件中读取一行以为新行腾出空间。使用 List> 比使用流更好。
  • @gunr2171 它正在工作,但我想重用相同的流而不是转换为字节数组,然后打开一个新的内存流

标签: c# asp.net-core .net-5 csvhelper


【解决方案1】:

您需要将流的当前位置移动到开头:

memStream.Position=0;

FileStreamResul 将从流的当前位置开始读取。

【讨论】:

    【解决方案2】:

    听起来有些东西处理得太早了。在引发错误之前,我通常会逐步查看代码到达的位置。

    尝试从“using var memStream”行中删除 using(我发现 c# 8.0 using 语句有时无法按预期工作)或将其包装在传统的 using 块中。

    【讨论】:

      【解决方案3】:

      当您处理 csv 或 writer 时,它们会处理基本流。只是不要处理任何流。 FileStreamResult 在发送数据时会处理 baseStream。

      所以删除这两行代码。 csv.Dispose(); writer.Dispose();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        • 1970-01-01
        • 2021-02-25
        • 2020-11-22
        • 2020-06-07
        • 2011-12-16
        相关资源
        最近更新 更多