Jiro Laboratory

C#、ASP.NET、JavaScript、Androidとか

ActionResult でテキストデータをダウンロード

ASP.NET MVC で文字列データをファイルとしてダウンロードする方法です。
こちらで紹介されている方法はファイルのダウンロードではなく、ブラウザにデータが表示されてしまいます。これはこれで使い道があるのですが、ファイルとしてダウンロードしたい場合の方法が簡単に見つけられなかったのでメモ。

Controller.File メソッド (System.Web.Mvc)を使う

ブラウザに表示したい場合はContentメソッドを使います。

public ActionResult ContentCsv()
{
    var text = "a,b,c" + "\r\n" + "d,e,f";
    return Content(text, "text/csv");
}

ファイルとしてダウンロードしたい場合は以下のように File メソッドを使います。
stringは直接送れないので、エンコードを指定して byte配列 に変換する必要があります。

public ActionResult DownloadCsv()
{
    var text = "a,b,c" + "\r\n" + "d,e,f";
    var data = Encoding.UTF8.GetBytes(text);
    return File(data, "text/csv", "test.csv");
}

何が違うのか

IEの開発者ツールで見ると、応答ヘッダに違いがあるのが分かります。
Fileメソッドを使った場合は

Content-Disposition attachment; filename=test.csv

が応答ヘッダに追加されています。
これによってブラウザがファイルの保存ダイアログを表示するようになります。

Contenメソッドを使った場合



Fileメソッドを使った場合