ASP.NETでCSVなどのファイルのダウンロードを実装する2014-03-11ASP.NETでCSVなどのファイルのダウンロードを実装するASP.NET概要ASP.NETでファイルのダウンロード機能を実装するとしたらどんな感じがいいのでしょうか。ファイルのダウンロード機能ひとつでも考えることがたくさんあります。今回の要件は複数のタイプのファイルをダウンロードするエラーが発生した場合、エラーページを表示するとして、下記の記事をベースにサンプルコードを書いてみました。簡単にラベルとボタンを設置します。ダウンロードするのはテキスト形式のファイルとCSVファイルの2種類です。各ボタンのクリックイベントでハンドラにリダイレクトします。リクエストパラメータには処理を行うクラス名を付与しておきます。Response.Redirect(url);}ジェネリックハンドラサンプルコードと同じく、自分のページのクリックイベントに書いてみたり、別のWebフォームのページロードイベントに書いてみたりしましたが、最終的にはファイルのダウンロード処理は画面を必要としないのでジェネリックハンドラに書きました。うーん、どれが一般的なんだろう。リクエストパラメータよりクラス名を取得し、リフレクションにより実装クラスをインスタンス化します。ここも各イベントごとにジェネリックハンドラに飛ばすか迷いましたが、リフレクションの理解のためにも処理をまとめてみました。処理中にブラウザを閉じるなどの事態に備え、ブラウザとの接続確認を行います。CSVダウンロードなどで調べているとResponse.End()メソッドのThreadAbortExceptionについての記事がたくさんヒットします。ありがたく教えに従い、回避します。想定外のエラーについては、仕様にもよりますが、今回は専用ページにリダイレクトしました。(context.Response.IsClientConnected)//Clientとの接続を確認します。System.Diagnostics.Debug.WriteLine("ブラウザとの接続が切断されています。System.Diagnostics.Debug.WriteLine("ThreadAbortExceptionが発生します。}}定数クラス定数クラスとしてDictionaryにキーとTypeを登録しておきます。これを元にリフレクションでクラスのインスタンス化をします。}}詳細クラス処理の詳細はインタフェースを実装した各クラスに書きます。実際にはDBアクセスなどを行いデータを取得すると思いますが面倒なので簡単のために雰囲気のみです。今回悩んだ部分のひとつなのですが、ContentTypeの設定がいまいち理解できませんでした。ContentTypeにテキスト、CSV、Excel、存在しないMIMEタイプなどを設定してみましたが処理に影響はありませんでした。ContentTypeが影響したのはファイル名の拡張子を指定しないときだったのでブラウザはContentTypeよりファイル名の拡張子を優先して判断しているのでしょうか。Chromeで確認)ここではサンプル通り、application/octet-streamというContentTypeを指定します。これによりダウンロード対象であることを表すことができます。(1)SearchAuthorid:sh_yoshidaレガシーな開発現場からVS-2010とC#の力で現代に戻ろうとしている.NETプログラマ。Linkはてなブログをはじめよう!sh_yoshidaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。