民芸的プログラミング 〜ソフトウェア開発日記〜

アクセスカウンタ

zoom RSS IE6 でダウンロードする際、正しいファイル名が得られない現象

<<   作成日時 : 2009/03/06 07:14   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 2 / トラックバック 0 / コメント 0

PHP でサーバー側アプリの開発をしていて、こういう現象に行き会った。
以前も同じ現象に行き会ったことがあったのだが、どうやって回避したかすっかり忘れており、知人に頼んで調べてもらった。

問題の現象というのは、例えば、test.php というスクリプトを作って、data.csv というファイルをダウンロードさせようとして
header("Content-Disposition: attachment; filename=data.csv");
というヘッダを出力した場合、IE7 やFirefox では正しいファイル名「data.csv」を得ることができるが、IE6 では、ダウンロード時のファイル名として、「test.php」が表示されてしまうのだ。

この問題に関してよくまとまっているのはこのページ。
IE6でダウンロード - ekurodaの日記
ただし、そこでは、symphony の話が混じっているので、その部分を省いて自分用のメモとして以下に概略を書き記しておく。

まず、一番のポイントはこの Microsoft 社の資料。
Internet Explorer 6 でダウンロード ダイアログに正しいファイル名が表示されない
IE6で、HTTP圧縮が使われている場合に限り、この現象が見られるとのこと。
Microsoft も問題は把握しているらしい。が、パッチ等の対策は取られていない。
なのでサーバー側での対応が必要となる。

具体的な対応としては、ファイルダウンロードの部分だけ、「圧縮しない」設定にするしかない。
Apache で mod_deflate を使っている場合、
SetEnvIf Request_URI "test\.php" no-gzip
などという設定をしてやればよい。
Apache の設定をいじれない環境だと、どうしようもない?

さらに、IE6 にはもう一つ、以下の Microsoft 社の資料にあるような問題もある。
Content-Disposition: attachemnt と Cache-Control: no-cache によるダウンロードの問題
IE6 では、特定の HTTP ヘッダーが使われている場合、インターネット上のファイルを開くことができないというのだ。
なので、この問題を回避するため、「ダウンロードされるファイルのキャッシュを制限しない」ようにする必要がある。

この対応としては PHP スクリプトで
header("Cache-Control: public");
としてやればよい。

まとめると、
・HTTP圧縮をしない
Apacheで「SetEnvIf Request_URI "test\.php" no-gzip」のような設定を入れる
・キャッシュを制限しない
PHPで「header("Cache-Control: public");」というような記述を入れる。

こうしておけば、Content-Disposition や Content-Type の値に変なギミックを入れる必要はなくなる。

ちなみに過去一ヶ月のデータを調べたところ、当ブログにアクセスしてくる Internet Explorer ユーザーのうち、半分強が IE6 を使用していた。IE6 はまだまだ主力ブラウザなのだ。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 2
なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
IE6 でダウンロードする際、正しいファイル名が得られない現象 民芸的プログラミング 〜ソフトウェア開発日記〜/BIGLOBEウェブリブログ
文字サイズ:       閉じる