【问题标题】:Append memory stream with data byte to download in csv将带有数据字节的内存流附加到 csv 中下载
【发布时间】:2020-08-30 08:58:53
【问题描述】:

我试图在循环中附加内存流,然后将其作为 csv 文件传递​​给 HTTPResponseMessage,但是当我下载文件时,没有显示任何数据。

 var stream = new System.IO.MemoryStream();
                for (int i = 1; i <= pageCount; i++)
                {
                     search = GetSearch(searchResultParam);
                    csvContent = GetCsvForSearchResult(search);
                    byte[] data = System.Text.Encoding.UTF8.GetBytes(csvContent);
                    stream.Write(data, 0, data.Length);
                
            }
           

            string fileName = "Review" + "-" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + ".csv";
            var result = new System.Net.Http.HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new System.Net.Http.StreamContent(stream)
            };
            result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            result.Content.Headers.ContentDisposition.FileName = fileName;
            result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
            result.Content.Headers.ContentLength = stream.Length;

但是如果我直接写到内存流中,数据正在下载中。

var stream = new System.IO.MemoryStream();
                for (int i = 1; i <= pageCount; i++)
                {
                     search = GetSearch(searchResultParam);
                    csvContent = GetCsvForSearchResult(search);
                    byte[] data = System.Text.Encoding.UTF8.GetBytes(csvContent);
                    stream = new System.IO.MemoryStream(data); 

            }


            string fileName = "Review" + "-" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + ".csv";
            var result = new System.Net.Http.HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new System.Net.Http.StreamContent(stream)
            };
            result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            result.Content.Headers.ContentDisposition.FileName = fileName;
            result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
            result.Content.Headers.ContentLength = stream.Length;

【问题讨论】:

  • 您是否尝试在添加数据后回到起点? stream.Seek(0, SeekOrigin.Begin);
  • 非常感谢它确实有效,但是数据不按顺序排列,字节长度被添加到其中一行。
  • 在您不使用 Stream.Write 的工作示例中,您在 for 循环的每次迭代中重新分配流,因此我无法 100% 清楚您想要的输出应该是什么。你能澄清一下吗?
  • 在我不使用 Stream.Write 的工作示例中,我正在测试案例,我希望将所有检索到的数据附加到内存流中。使用 stream.Seek(0, SeekOrigin.Begin);解决了问题,下载的文件中可以看到数据,但是没有检索到所有数据,并且附加数据中存在问题。我也尝试使用 SeekOrigin 的其他枚举,但没有运气
  • 我猜你把 seek 放在循环中,如果你把它拉到 for 循环结束之后,我怀疑它会按预期工作。

标签: c# export-to-csv memorystream


【解决方案1】:

在让客户端使用它之前先寻找流的开始

var stream = new System.IO.MemoryStream();
                for (int i = 1; i <= pageCount; i++)
                {
                     search = GetSearch(searchResultParam);
                    csvContent = GetCsvForSearchResult(search);
                    byte[] data = System.Text.Encoding.UTF8.GetBytes(csvContent);
                    stream.Write(data, 0, data.Length);
                
            }
            // will make the reads start at the beginning 
            stream.Seek(0, SeekOrigin.Begin);
           
            string fileName = "Review" + "-" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + ".csv";
            var result = new System.Net.Http.HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new System.Net.Http.StreamContent(stream)
            };
            result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            result.Content.Headers.ContentDisposition.FileName = fileName;
            result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
            result.Content.Headers.ContentLength = stream.Length;

【讨论】:

  • 然后您需要将GetCsvForSearchResult(search) 拆分为两种方法,一种方法返回您调用一次的标头。还有一个返回你循环的数据
猜你喜欢
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2017-10-31
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多