スキップしてメイン コンテンツに移動

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はそろそろ周りと協調することを覚えような。


コメント

このブログの人気の投稿

[VB.NET]オレオレ証明書でSSL通信するための短絡的な解決法

VB.NETソフトウェアでサーバーと通信することはよくある事だと思いますが、最近はHTTPを使って明けっ広げに刺しに行くよりHTTPSを使って暗号化してこそこそやった方が時代の流れに即した感じですよね(違うか)。 いちいちテスト環境でSSL証明書を用意するのも面倒だということで、セキュリティ的には全くよろしくない方法で迂回できるので紹介します。

[JS]Canvasでよく使う描画テクまとめ

HTMLで画像をいじくりたい時は、canvasを利用して編集するのは一般的ですが、WindowsストアアプリではHTML+CSS+JSでのアプリ開発ができる事もあって、簡単な画像編集であれば、C#やVBを使うより分かりやすいし資料が多く、C++でDirectXをガリガリ書くよりお手軽。入出力もファイルピッカーを使えば簡単に実装できます。今回は、Windowsのコードではなく、Canvasを利用する時のJavaScriptを使いどきに合わせてまとめていきます。

curl の基本的な使い方 -設定編-

今回のcurl TIPSは、curlをより日常的に使っていくためのHow toです。curlには、数多くのオプションが用意されていて、それらを組み合わせる事で様々な事が楽になるでしょう。サービス監視の自動化などにはまさにcurlの得意分野です。 今回は、curlを更に自分のものにしていくために大事なカスタマイズの部分を解説します。