ASP.NET MVC3でCSVファイルを出力する必要に迫られていたのですが、その方法がいまいちわからず困っていました。XMLファイルを出力する方法(ActionResultを継承する方法)は比較的簡単に理解できたのですが、同じ方法で行った場合、ファイル名を指定してもURLがファイル名になってしまい思い通りに行かず困りました。
いろいろとGoogleで検索していたところ、FileResultを使用すればよいらしいという情報をゲットしたので早速試してみたところうまくいきました。 [csharp] /// /// CSVデータの出力応答を返すクラス /// public class CsvResult : FileResult { /// /// コンストラクタ /// public CsvResult(): base("text/csv") { }
#region Overrides of FileResult
protected override void WriteFile(HttpResponseBase response)
{
Stream outputStream = response.OutputStream;
using (var mstream = new MemoryStream())
{
using (var writer = new StreamWriter(mstream, Encoding.GetEncoding("Shift_JIS")))
{
// データの書き込み
writer.Write(Data);
writer.Flush();
// レスポンスデータに書き込みを行う
outputStream.Write(mstream.GetBuffer(), 0, (int) mstream.Length);
}
}
}
#endregion
///
/// 書き込みデータ
///
public string Data { get; set; }
} [/csharp]
msdnを確認すればわかることだったのですが、FileResultはActionResultから派生したクラスです。特にバイナリデータをレスポンスデータとして返すときに利用できます。
■ActionResult クラス (System.Web.Mvc) http://msdn.microsoft.com/ja-jp/library/system.web.mvc.actionresult.aspx
XMLデータを取得する場合には、ActionResultから派生するクラスが存在しないこともありActionResultクラスを継承したクラスを作成しましたが、今回の場合はFileResultが適切ということになります。
参考
■Asp.Net custom ActionResult: CSV - Notes For .NET http://www.notesfor.net/post/2010/06/28/AspNet-custom-ActionResult-CSV.aspx