追加带有数据字节的内存流以在csv中下载

问题描述

我试图将内存流循环添加,然后将其作为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,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;

解决方法

在让客户端使用流之前先搜索流

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,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;