deezus blog

.Net Core、Typescriptを中心に技術的ノウハウを公開しています

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

サーバの処理を通じて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の場合開かれるプレイヤーです) f:id:deezus:20190522162735p:plain

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

public IActionResult Media()
{
    Response.Headers.Add("Accept-Ranges", "bytes"); // ←これを追加
    return File(System.IO.File.OpenRead("xxx.m4a"), "media/mp4");
}