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);

ただし、1 回の呼び出しで実際にすべてが読み取られると想定しないでください。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 に答える