2011年1月21日金曜日

IEでのダウンロード処理 問題と対策

ファイルをダウンロードさせる処理で、IE7で問題がでてたので、なんとなくメモ。

[問題]
a) https通信のページで、IEだけファイルのダウンロードできない。。(IE8は不明)
b) ファイル名に日本語を含めると文字化け
c) mp3ファイルをダウンロードさせると、必ずメディアプレイヤーが起動されてしまう。

とりあえず今回は、「a) https通信のページで、IEだけファイルのダウンロードできない。」だけメモ。

調べてみると、IEの仕様のようで、Microsoftのサポートページにちと古いけど掲載されていた。

(Content-Disposition: attachemnt と Cache-Control: no-cache によるダウンロードの問題)
http://support.microsoft.com/default.aspx?scid=kb;ja;436605

(Internet Explorer が SSL 経由によるファイルのダウンロードで "No-Cache" ヘッダーを処理できない)
http://support.microsoft.com/kb/323308/ja
(Internet Explorer で SSL Web サイトの Office 文書を開けない)
http://support.microsoft.com/kb/316431/ja


上記ページでは、対象製品はIE5やIE6SP1などになっていましたが、IE7になってもブラウザ側で対処してくれてはいないようです。
#他のブラウザでは出ないんだから、がんばってほしかった。orz

現象は、HTTPヘッダーに、以下のようにキャッシュしないように指定している場合に発生するそうです。

Pragma:no-cache
Cache-control:no-chache,max-age=0,must-revalidate


解決方法のひとつとして、レジストリを使用して回避する方法が書いてあったけど、そんなことを使う人にお願いできるような環境に無いので、他の方法を調査。

解決策としては、HTTPヘッダーに

Pragma:private
Cache-control:private

を出力すればよさそう。

PHPの場合だと、header()関数を使って、
header("Cache-Control:private");
header("Pragma:private");

とかけばよいそうです。


サーバ側でZend Frameworkを使っているので、Zend_http_ResponseクラスのsetHeader()を使ってやればOKなはずということで、ControllerクラスのxxxAction()の中で、

$response=$this->getRequest();
$response->clearHeaders();
$response>setHeader(" Cache-Control ","private");
$response>setHeader(" Pragma ","private");

として、データを出力する前にヘッダーを操作してたんだけど、なぜか、症状がかわらない。

ヘッダーの内容を確認していると、

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, must-revalidate, post-check=0,pre-check=0,private
Pragma: no-cache, private


となっていて、なにも操作していないのに、すでにno-cacheが設定済みになっている。
直前にclearHeader()メソッドを実行しているんだから、消してくれるのだと思ったけど、そうでもないみたい。
どうしたものかと、リファレンスを読んでみると、setHeader()には3番目の引数があって、同じ項目に対して上書きするか制御ができることがわかった(デフォルトはfalse)。

なので、

$response>setHeader(" Cache-Control ","private",true);
$response>setHeader(" Pragma ","private",true);


として、3番目の引数にtrueを設定することで、回避できた。
※なぜno-cacheが設定されいるかは今でもわかんない。暇ができたら調べてみよう。

0 件のコメント: