メモの日々


2005年07月20日(水) [長年日記]

[web][windows] IE6でダウンロードダイアログが2回表示される

問題

ウェブアプリケーションでHTTPヘッダに

Content-Disposition:attachment; filename="foo.csv"
Content-Type: application/octet-stream

を付与することでウェブブラウザにファイルをダウンロードするかどうかを問い合わせるダイアログを表示させようとした。

で、手元のIE6だと「開く」「保存」「キャンセル」「詳細情報」を選ぶダイアログが表示されるのだけれど、ここで「開く」を選んだときに再度同じダイアログが表示されてしまう、という問題に遭遇した。2度目のダイアログで「開く」を選ぶと正しくファイルの内容が表示される。

調査

別のウェブアプリケーションで試すと、ダイアログが2回表示されるという問題は発生しない。HTTPヘッダを比べると、問題が発生する方だけCache-Controlヘッダなどが付与されておりこの辺が怪しい。

で、テスト用に

<?php
header('Content-type: application/octet-stream');
header('Expires: Thu, 19 Nov 1981 08:52:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Pragma: no-cache');
header('Content-Disposition: attachment; filename="test.csv"');
echo 'test,test,test';
?>

というPHPコードを書いて再現させようとしたが、

Internet Explorer では、xxx.xxx.xxx.xxx - xxx.xxx をダウンロードできません。

このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。

というエラーになってしまった。マイクロソフトのサイトにあるContent-Disposition: attachemnt と Cache-Control: no-cache によるダウンロードの問題が発生しているように思われる。(追記:本件はInternet Explorer が SSL 経由によるファイルのダウンロードで "No-Cache" ヘッダーを処理できないが原因かもしれない。当時SSLを使用していたかは覚えていないが、エラーメッセージはこちらと一致する。)

では何故件のウェブアプリケーションではこのエラーが表示されないのか。どちらのプログラムが返すHTTPヘッダも同じに見えるのだが。

これ以上先に進めなくて、結局どのような場合にダウンロードのダイアログが2回表示されるのかは分からなかった。

回避方法

現象はよく分からないままだが、回避方法はある。Content-Dispositionヘッダの値を「attachment」以外の文字列に設定すればよい。attachmentと書きたいけれど、こう書くと変な動作をするのだから仕方ない。

(追記)

@IT会議室に同じような話題があった。

ここに、POSTだと発生しGETだと発生しないという説が書かれていた。あと、マイクロソフトのサポート技術情報にもあるんだな。

ここには

この問題を解決するには (Internet Explorer 5.5 のみ)、Service Pack 2 にアップデートします。

とあるけど、IE6で起こっている。現象は同じでも原因は違うのかも。

(追記2)

はてなにも話題があった

- 送信方法が POST の場合、HTTP ヘッダの Content-Disposition を外すかレジストリを操作することにより回避可能

とあるけどレジストリのどこを操作すればいいのだろう。

(追記3)

2002年のPHP-users MLに、session_cache_limiter()を使用して解決したという話があったのでメモ(ダイアログが2回表示される問題ではないが)。

あと、Content-DispositionヘッダについてはRFC2183で規定されていたのでその日本語訳をメモ。

やること

  • オーブンレンジ用べんり棚
  • ブラウンの安い電動歯ブラシ買う
  • 蛍光灯を捨てる
  • 請書
  • クリーニング
  • 清掃用具
  • 銀行へ行け
本日のツッコミ(全3件) [ツッコミを入れる]
通りすがりの者 (2006年04月11日(火) 22:10)

ダイアログボックス2回表示の問題で、同様に困っています。<br>このページはとても参考になりました。<br>ありがとうございました!

感謝してます男 (2007年03月14日(水) 12:08)

「黒い画面⇔白黒の縦じま」を繰り返していたのですが、<br>1時間ほど置いていましたら、正常に動作するようになりました。<br>非常に参考になりました。ありがとうございました。

感謝してます男 (2007年03月14日(水) 12:09)

投稿ミスです。すいません。