我正在尝试将此文件发送到输出流,但无法弄清楚它为什么吐出基本上是空的mp3文件。正如你所看到的那样,我会过早地关闭流,所以我现在已经注释掉了。任何指针都赞赏。
using (FileStream mp3file = File.OpenRead(newFile))
{
context.Response.AddHeader("content-transfer-encoding", "binary");
context.Response.ContentType = "audio/mpeg";
MemoryStream memStream = new MemoryStream();
byte[] bytes = new byte[mp3file.Length];
memStream.SetLength(mp3file.Length);
mp3file.Read(memStream.GetBuffer(), 0, (int)mp3file.Length);
memStream.Write(bytes, 0, (int)mp3file.Length);
//mp3file.Close();
memStream.WriteTo(context.Response.OutputStream);
//memStream.Close();
}
答案 0 :(得分:5)
这部分是问题所在:
byte[] bytes = new byte[mp3file.Length];
...
// Here you're reading into the memory stream buffer...
mp3file.Read(memStream.GetBuffer(), 0, (int)mp3file.Length);
// And here you're overwriting it with the byte array full of zeroes!
memStream.Write(bytes, 0, (int)mp3file.Length);
你不应该假设对Read
的单个调用实际上会读取所有内容。目前尚不清楚您正在使用哪个版本的.NET,但如果您使用的是.NET 4或更高版本,则可以使用Stream.CopyTo
使其更简单。
还不清楚你为什么要使用MemoryStream
。你为什么不直接复制到输出流?
mp3File.CopyTo(context.Response.OutputStream);
或者,如果您使用的是旧版本的.NET:
byte[] buffer = new byte[16 * 1024]; // For exmaple...
int bytesRead;
while ((bytesRead = mp3File.Read(buffer, 0, buffer.Length)) > 0)
{
context.Response.OutputStream.Write(buffer, 0, bytesRead);
}
(这几乎相当于CopyTo
。)