FileResultでメディアファイルを返す場合の注意点

.Net Core

サーバの処理を通じてcsvなどをダウンロードする際、FileResultを使用します
この場合のActionは例えば以下のようなコードになります

public IActionResult Csv()
{
    return File(System.IO.File.OpenRead("xxx.csv"), "text/csv");
}

非常に簡単ですが多くの場合はこれでうまくいきます
しかし、メディアファイルの場合は少し事情が違います

public IActionResult Media()
{
    return File(System.IO.File.OpenRead("xxx.m4a"), "media/mp4");
}

このActionのページにアクセスするとブラウザの機能でプレイヤーが開かれ、メディアファイルが再生されます。(以下の画像はFirefoxの場合開かれるプレイヤーです)

ただし、このプレイヤーは再生位置をシークできない問題があります
ヘッダーにAccept-Ranges: bytesを追加することで正常にシークできるメディアファイルを返すことができます

public IActionResult Media()
{
    Response.Headers.Add("Accept-Ranges", "bytes"); // ←これを追加
    return File(System.IO.File.OpenRead("xxx.m4a"), "media/mp4");
}
タイトルとURLをコピーしました