如何将内存流下载到文件?

use*_*872 12 c# asp.net memorystream

我正在使用下面的示例代码来编写和下载内存流到C#中的文件.

MemoryStream memoryStream = new MemoryStream();
TextWriter textWriter = new StreamWriter(memoryStream);
textWriter.WriteLine("Something");           
byte[] bytesInStream = new byte[memoryStream.Length];
memoryStream.Write(bytesInStream, 0, bytesInStream.Length);
memoryStream.Close();          
Response.Clear();
Response.ContentType = "application/force-download";
Response.AddHeader("content-disposition",
                   "attachment; filename=name_you_file.xls");
Response.BinaryWrite(bytesInStream);
Response.End();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

指定的参数超出了有效值的范围.
参数名称:offset

可能是什么原因?

Hen*_*rik 26

在代码中将数据复制到数组的位置,TextWriter可能没有刷新数据.当您使用Flush()或Close()时会发生这种情况.

看看这是否有效:

MemoryStream memoryStream = new MemoryStream();
TextWriter textWriter = new StreamWriter(memoryStream);
textWriter.WriteLine("Something");   
textWriter.Flush(); // added this line
byte[] bytesInStream = memoryStream.ToArray(); // simpler way of converting to array
memoryStream.Close(); 

Response.Clear();
Response.ContentType = "application/force-download";
Response.AddHeader("content-disposition", "attachment;    filename=name_you_file.xls");
Response.BinaryWrite(bytesInStream);
Response.End();
Run Code Online (Sandbox Code Playgroud)


Pet*_*old 6

你在逻辑上做错了.首先,您将一些文本写入MemoryStream,然后将空数组写入同一个流.我假设您正在尝试将流的内容复制到bytesInStream数组中.您可以通过调用创建此数组memoryStream.ToArray().

或者,您可以通过使用将流直接写入响应输出流来避免阵列复制MemoryStream.CopyTo.BinaryWrite用这个替换你的电话:

 memoryStream.Position = 0;
 memoryStream.CopyTo(Response.OutputStream);
Run Code Online (Sandbox Code Playgroud)

注意:显式将流定位在开头,因为CopyTo将从当前位置复制.