ファイルをダウンロードできるようにする †ここではサーバーにあるファイルをダイアログを表示して、Webブラウザでダウンロードできるようにする方法を紹介します。 レスポンスヘッダに"Content-Disposition"フィールドを追加し、HttpResponse.WriteFileメソッドで書き込みます。"Content-Disposition"については、RFC1806をご覧ください。 次のコードを実行すると、Internet Explorerでは、「ファイルのダウンロード」ダイアログが表示され、デフォルトでファイル名が「test.txt」で保存されるようにしています。このコードは、ページクラスに記述されているものとします。 #code(vbnet){{
一般的には、"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」を使わなければ正常に機能しないという話もあります。 これら以外にも、以下のような問題があります。
参考 †
|