2013-04-26 124 views
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(); 

       } 

回答

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等价物。)

+0

谢谢。我认为,如果我删除了'memStream.Write(bytes,0,(int)mp3file.Length);'它会工作,但没有任何dics。这是.net 4.作为一个高效的代码和一个noob的.net我有点困惑,试图实现你的建议。这是我尝试过的:'byte [] bytes = new byte [mp3file.Length]; mp3file.Read(bytes,0,(int)mp3file.Length); mp3file.CopyTo(context.Response.OutputStream);'没有喜悦。我真的很想亲自尝试,并感谢您的帮助。 – 2013-04-26 20:11:22

+0

@MrBrimm:那么你已经*读取了所有的数据 - 所以'CopyTo'不会帮助你。为什么麻烦读到'字节'呢? *只需*使用'CopyTo'?此外,如果您遇到问题,并且您对.NET相对较新,则可以停止*尝试进行微优化。先写清楚的代码。当你对你的代码,语言和平台有绝对的信心时*你可以优化,如果你真的必须的话。 – 2013-04-26 20:22:50

+0

这些文件小于10k。我使用(FileStream mp3file = File.OpenRead(newFile))重试了这个文件并再次清空文件context.Response.AddHeader(“content-transfer-encoding”,“binary”); context.Response.ContentType =“audio/mpeg”; mp3file.CopyTo(context.Response.OutputStream); }' – 2013-04-26 20:34:24