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)
你在逻辑上做错了.首先,您将一些文本写入MemoryStream,然后将空数组写入同一个流.我假设您正在尝试将流的内容复制到bytesInStream数组中.您可以通过调用创建此数组memoryStream.ToArray().
或者,您可以通过使用将流直接写入响应输出流来避免阵列复制MemoryStream.CopyTo.BinaryWrite用这个替换你的电话:
memoryStream.Position = 0;
memoryStream.CopyTo(Response.OutputStream);
Run Code Online (Sandbox Code Playgroud)
注意:显式将流定位在开头,因为CopyTo将从当前位置复制.