とあるシステムを構築中に、エクセルファイルをダウンロードさせる機能を実装しました。
そこでちと困ったことになったので紆余曲折をまとめておきます。
実装の内容は
最初に実装した状態では、FireFox、chromeでは問題なくダウンロードできたので、ちょろいと思っていたのですが、問題はIE8での動作。
IE8でダウンロードを試みると、「download.php?id=xx」というファイル名のファイルをダウンロードしようとしてエラーが発生。
なんじゃこりゃと調べていると、どうもIEのバグのようで。
引っかかっているのは、実装の4と5の部分。
具体的には、
この部分は変更のしようがないので、さらに調べていると
早速download.phpの先頭に上記のコードを入れてみると
無事ダウンロードできた!
ついでに言うと、今回のシステムはPHP、MySQLともにUTF8でコーディングしていたので、ダウンロードしたファイルはしっかり文字化けしていた。
IEはそろそろ周りと協調することを覚えような。
そこでちと困ったことになったので紆余曲折をまとめておきます。
実装の内容は
- クリックすればエクセルデータ(xlsファイル)のダウンロードができる
- ファイルはdocumentRoot内に保存するが、同名ファイルも上書きせずに保存できるようにする
- MySQLで、ファイル名と保存のために便宜上付けた名前を対にしたテーブルを作成
- 「download.php?id=xx」という形でリンクを張り、PHPでHTTPヘッダなどをいじくる
- 以上の処理を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はそろそろ周りと協調することを覚えような。
コメント
コメントを投稿