1. ホーム
  2. c#

[解決済み] [Solved] Asp.Net MVCでFileResultを使用して任意のタイプのファイルをダウンロードしますか?

2022-04-02 12:47:49

質問

Asp.Net MVCアプリケーションからユーザーがファイルをダウンロードできるようにするために、FileResultを使用することを提案されたことがあります。しかし、私が見つけることができる唯一の例は、常に画像ファイル(コンテンツタイプimage/jpegの指定)と関係があります。

しかし、ファイル形式がわからない場合はどうすればいいのでしょうか?私は、ユーザーが私のサイトのファイルエリアからほとんどすべてのファイルをダウンロードできるようにしたいのです。

これを行う方法の一つを読んだことがありました( 前の記事 Save As ダイアログに表示されるファイル名が、ファイルパスとアンダースコアを連結したもの (folder_folder_file.ext) であることを除いては、うまく動作します。) また、私が見つけたBinaryContentResultというカスタムクラスを使用する代わりに、FileResultを返すべきだという意見もあるようです。

どなたか、MVCでこのようなダウンロードを行う正しい方法をご存じですか?

EDIT。 私はその答え(下記)を得ましたが、他の誰かが興味を持っているならば、完全な動作コードを投稿すべきだと思いました。

public ActionResult Download(string filePath, string fileName)
{
    string fullName = Path.Combine(GetBaseDir(), filePath, fileName);

    byte[] fileBytes = GetFile(fullName);
    return File(
        fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}

byte[] GetFile(string s)
{
    System.IO.FileStream fs = System.IO.File.OpenRead(s);
    byte[] data = new byte[fs.Length];
    int br = fs.Read(data, 0, data.Length);
    if (br != fs.Length)
        throw new System.IO.IOException(s);
    return data;
}

どのように解決するのですか?

一般的なオクテットストリームのMIMEタイプを指定すればよい。

public FileResult Download()
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(@"c:\folder\myfile.ext");
    string fileName = "myfile.ext";
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}