ASP.NET MVCの4つのファイル結果の違いは何ですか


136

ASP.NETには、4種類のファイル結果があります。

  • FileContentResult:バイナリファイルの内容を応答に送信します。
  • FilePathResult:ファイルの内容を応答に送信します
  • FileResult:応答に書き込むためのバイナリ出力を返します
  • FileStreamResult:Streamインスタンスを使用してバイナリコンテンツを応答に送信します

これらの説明はMSDNからのものであり、FileStreamResultを除いて、最初の3つのサウンドは同じです。では、それらの違いは何ですか?

回答:


176

FileResult 他のすべての抽象基本クラスです。

  • FileContentResult -ファイルとして返したいバイト配列がある場合に使用します
  • FilePathResult -ディスク上にファイルがあり、そのコンテンツを返したい場合(パスを指定)
  • FileStreamResult -ストリームを開いており、そのコンテンツをファイルとして返したい

ただし、これらのクラスを使用する必要はほとんどありません- Controller.Fileオーバーロードの1つを使用して、ASP.NET MVCに魔法をかけることができます。


29

すばらしい質問です...そして詳細に値します。面白い状況の結果、私はここにいます。MVC3 / C#環境を介していくつかのPDF添付ファイルを配信していました。コードがリリースされ、クライアントがChromeを使用していて、ファイルの種類が「pdf-、attachment.pdf-、添付ファイル」に変換されているときに、ダウンロードが異常な動作をしているという応答をクライアントから受け取り始めました。うん...あなたはそれを手に入れました...全部。したがって、それを単に「pdf」に書き換えても、ファイルはそのまま保存されますが、なんとめちゃくちゃなのでしょう。

したがって、初期状態を説明するために、「Content-Disposition」ヘッダーを設定してからFileContentResultを返していました...

var cd = new System.Net.Mime.ContentDisposition
            {
                FileName = result.Attachment.FileName,
                Inline = false
            };
            Response.AppendHeader("Content-Disposition", cd.ToString());

return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);

良さそうだ。IEで問題なく動作しました。そこで、私はいくつかの調査を行い、代わりにFileStreamResultを実装しようとしました(Content-Dispositionセッターを維持します)。

MemoryStream dataStream = new MemoryStream();
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length);
dataStream.Position = 0;
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));

Chromeの問題を修正しました。うーん...でも、なぜ私は完全に優れたバイト配列を取得してストリーミングし、これを介して返さなければならないのですか?

それからフィドラーがやってきた。

FileContentResultを使用して、ヘッダーに2つのContent-Dispositionを取得しました。FileStreamResultを使用して、1を取得しました。

FileContentResultは、ファイル名を提供するときにContent-Dispositionヘッダーを追加し、Chromeはこのヘッダーの倍数をエラーと見なします。

奇妙な反応...しかし、間違いなく知っておくべきことです。


3
ヒントにすぎません。.NET4 System.Web.MimeMapping.GetMimeMapping(filename)以降では、簡単にアクセスできない場合にMIMEタイプを収集するために使用できます。
GONeale 2014年

4
File結果にファイル名を提供することはFileDownloadNameContent-Dispositionヘッダーを設定するそのプロパティを設定することを意味します。そして、それはutf-8ファイル名を正しくサポートしますが、これはContentDispositionヘルパークラスではありません(詳細については、ここの私のコメントを参照)
フレデリック

1
はい、@Frédéricに感謝します。すべてのSO投稿のうちのあなただけが、何が起こっているのか私に説明してくれました!
Nacht
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.