• バックアップ一覧
  • ソース を表示
  • ASP.NET Tips/ファイルをダウンロードできるようにする は削除されています。
    • 1 (2007-11-08 (木) 03:42:25)

現在執筆中です。

ファイルをダウンロードできるようにする

ここではサーバーにあるファイルをダイアログを表示して、Webブラウザでダウンロードできるようにする方法を紹介します。

レスポンスヘッダに"Content-Disposition"フィールドを追加し、HttpResponse.WriteFileメソッドで書き込みます。"Content-Disposition"については、RFC1806をご覧ください。

次のコードを実行すると、Internet Explorerでは、「ファイルのダウンロード」ダイアログが表示され、デフォルトでファイル名が「test.txt」で保存されるようにしています。このコードは、ページクラスに記述されているものとします。

#code(vbnet){{
}}

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
//ダウンロードするファイルのパス
string downloadPath = this.Server.MapPath("test.txt");
//保存時に提案するデフォルトのファイル名
string downloadName = "test.txt";
 
this.Response.Clear();
//MINE型を指定する
this.Response.ContentType = "application/octet-stream";
//Content-Dispositionヘッダを追加する
this.Response.AddHeader("Content-Disposition",
    "attachment; filename=" + downloadName);
 
//ファイルを書き込む
this.Response.WriteFile(downloadPath);
//.NET 1.1 SP1以降では次のようにするとよい
//this.Response.TransmitFile(downloadPath);
 
//送信して終了
this.Response.End();
注意

WriteFileメソッドではサイズの大きいファイルを指定することができません。回避法に関しては、「PRB: Response.WriteFile Cannot Download a Large File」や「[FIX] サイズの大きなファイルをダウンロードすると、大量のメモリが失われ、Aspnet_wp.exe プロセスが繰り返される」で紹介されています。これらによると、上記コードのコメントで示したようにTransmitFileメソッドを使うか、FileStream.Readメソッドを使って少しずつファイルを読み込み、HttpResponse.BinaryWriteメソッド(もしくは、OutputStream.Writeメソッド)で書き込むようにします。

一般的には、"Content-Disposition"があり、"ContentType"が"application/octet-stream"となっている場合に「名前をつけて保存」ダイアログが表示されることになっています。しかし実際には、これでは正常に機能しないケースが多いようです。特にIE5.5以前では、問題が多いようです。よって"ContentType"を"application/download"や"application/octet-stream-dummy"などの意味のないものに変えた方が確実かもしれません。

また、上記の例では"ContentType"を"application/octet-stream"としていますが、適当なMINE型が分かっているのであれば、それを指定してもかまいません。例えば、テキストファイルでは、"text/plain"です。

保存ファイル名について

Content-Dispositionで指定されたファイル名が必ずつけられて保存される保障はありません。そもそもファイル名を強制して保存することはセキュリティ面で問題です。

Content-Dispositionで指定するファイル名にはASCII文字しか使えません。それ以外の文字についてはRFC2231で定義されていますが、この方法では、少なくともIEでは、うまくいきません。「[PRB] AddHeader, AppendHeader で日本語ファイル名が文字化けする」によると、HttpUtility.UrlEncodeメソッドを使うことによりある程度回避できるということですが、絶対的な解決法でないため、ファイル名に日本語を指定するのはやめるべきです。

参考

上記以外のContent-Dispositionに関するIEのバグ

上記の問題以外に、IEのバージョンによっては、Content-Dispositionが150バイト以上だとエラーが出るという問題もあります。

また、IE5.5以前では、Content-Dispositionの「attachment」の代わりに「inline」を使わなければ正常に機能しないという話もあります。

これら以外にも、以下のような問題があります。

参考


ページ情報
  • 作成日 : 2007-11-08 (木) 03:42:25
  • 作成者 : DOBON!
  • 最終編集日 : 2007-11-08 (木) 03:42:25
  • 最終編集者 : DOBON!
[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]