2013-04-26 120 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