はじめに

Webシステムは、HTMLを送り出すだけではなく、ファイルのダウンロードも行わなくてはなりません。
画像データであったり、CSVファイル、PDFなどがあると思います。
それらをダウンロード出来るようにしてみましょう。

ファイルからのダウンロード

コントローラーに以下のプログラムを記述して、それを直接URLを指定すると、ダウンロードが始まります。
今回は、Homeのコントローラーに記述してみました。
PDFファイルは、「/Views/Shared」に配置しました。

コントローラにある、Fileメソッドを実行することにより、ファイルをダウンロードさせることができます。
第一引数:サーバーにあるダウンロードさせたいファイル
第二引数:MIME
第三引数:ダウンロード時のファイル名

今回は、ユーザーから見えるパスにファイルを置いてありますが、見えないところに置いても、正しくダウンロードされます。
public FileResult DownloadFromFile()
{
    return File(Server.MapPath("/Views/Shared/Test.pdf"), 
          "application/pdf", 
          "ailight.pdf");
}


バイト列からのダウンロード

CSVファイルを、ダウンロードさせてみましょう。
簡単にできますよ。
public FileResult DownloadFromByteArray()
{
    var targetString = "";

    targetString += "KeyID,Name,Address\r\n";
    targetString += "1,AILight,Niigata\r\n";
    targetString += "2,TestUser,Tokyo\r\n";
    targetString += "3,CSVUser,Osaka\r\n";

    return File(System.Text.Encoding
                .GetEncoding("shift_jis")
                .GetBytes(targetString),
                "text/csv", "ailight.csv");
}

FileStreamからのダウンロード

FileStreamからもファイルをダウンロードさせることができます。
public FileResult DownloadFromFileStream()
{
    var webClient = new System.Net.WebClient();
    var stream = webClient.OpenRead("http://www.ailight.jp");
    return File(stream, "text/html");
}

画像のダウンロード

以前、WebForm版を掲載したことがあるのですが、そのプログラムをMVC版へ移植してみましょう。
画像データを、直接プログラムで作成します。
その後、そのファイルをPNGとして保存して、それをバイト列で送り返すことで、画像を表示させることができます。
public FileResult DownloadFromImage()
{
    var bitmap = new System.Drawing.Bitmap(500, 60);
    var graphics = System.Drawing.Graphics.FromImage(bitmap);
    var stringText = "アイライト";
	var font = new System.Drawing.Font("MS 明朝", 30);
	var sizeF = graphics.MeasureString(stringText, font);
	graphics.FillRectangle(System.Drawing.Brushes.White, 
                            10, 10, 
                            bitmap.Width - 20, 
                            bitmap.Height - 20);
    graphics.DrawString(stringText, font,
                        System.Drawing.Brushes.Blue,
                        (bitmap.Width - sizeF.Width) / 2,
                        (bitmap.Height - sizeF.Height) / 2);
        
    var memoryStream = new System.IO.MemoryStream();
	bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
    return File(memoryStream.ToArray(), "image/png");
}


おわりに

ふぅ、調査しながら書き上げていくと結構大変な作業でした。
CSVのダウンロードや、画像ファイルのダウンロードを説明しましたので、通常のWebシステムでしたらこれで対応出来るかと思います。

グラフとかも書けますので、頑張ってみてください。
実際にグラフを描画するときには、グラフを描画するセンスのほうがプログラムを記述するより大切ですね(笑)
あんまり格好よくありませんが、左メニューの、「Amazonでお買い物」でグラフ描画を行っています。

調査環境

VS2010 + MVC2
ASP.NET
C#

更新日

2011/06/05:アップ