0

我正在尝试将此文件发送到输出流,但无法弄清楚为什么它基本上会吐出一个空的 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();

                }
4

1 回答 1

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它来使其更简单。

不清楚你为什么要使用 a 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。)

于 2013-04-26T19:20:21.297 回答