2011/02/13

IEでダウンロードができない!

とあるシステムを構築中に、エクセルファイルをダウンロードさせる機能を実装しました。
そこでちと困ったことになったので紆余曲折をまとめておきます。




実装の内容は
  1. クリックすればエクセルデータ(xlsファイル)のダウンロードができる
  2. ファイルはdocumentRoot内に保存するが、同名ファイルも上書きせずに保存できるようにする
  3. MySQLで、ファイル名と保存のために便宜上付けた名前を対にしたテーブルを作成
  4. 「download.php?id=xx」という形でリンクを張り、PHPでHTTPヘッダなどをいじくる
  5. 以上の処理をSSL通信を用いて行う
という内容。
最初に実装した状態では、FireFox、chromeでは問題なくダウンロードできたので、ちょろいと思っていたのですが、問題はIE8での動作。

IE8でダウンロードを試みると、「download.php?id=xx」というファイル名のファイルをダウンロードしようとしてエラーが発生。

なんじゃこりゃと調べていると、どうもIEのバグのようで。
引っかかっているのは、実装の4と5の部分。
具体的には、
  • SSL通信中に
  • Content-Disposition: attachment; filename=xxx.xls というHTTPヘッダを送っている
という部分が引っかかっている模様。
この部分は変更のしようがないので、さらに調べていると
session_cache_limiter ('public');
をsession_start(); より前にセットすることでエラーが回避できるとのこと。
早速download.phpの先頭に上記のコードを入れてみると
無事ダウンロードできた!

ついでに言うと、今回のシステムはPHP、MySQLともにUTF8でコーディングしていたので、ダウンロードしたファイルはしっかり文字化けしていた。
header ("Content-Disposition: attachment; filename=". urlencode("ファイル名"). "\"");
で文字化けも解消。

IEはそろそろ周りと協調することを覚えような。


0 件のコメント:

コメントを投稿