スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[PHP] Content-Disposition: attachment; でファイルを出力したら古いInternetExplorer(IE6など)で「この文書を開くときにエラーが発生しました」と表示されるでござる

ファイルをダウンロードさせるとき、ヘッダを Content-Disposition: attachment; とか
打ってやって、読んだファイルの内容を続けて出力させて、ということをやりますよね。

PHPでファイルをDLさせる際のPHPコード例
http://phpspot.org/blog/archives/2008/02/phpdlphp.html

例)
$len = filesize( $file );
header( 'Content-Type: application/octet-stream' );
header( 'Content-Disposition: attachment; filename="'.$file.'"' );
header( 'Content-Length: '.$len );
readfile( $file );

たいていは機嫌よくダイアログが出てくれて、開くか保存を選ぶようになって、
開くならアプリケーションでファイルを開くし、保存ならさらに保存ダイアログが
開いたり。

でも、古い Internet Explorer を使うと、「開く」を選んだときに
「ファイルが見つかりません」であるとか、「ファイルを開く際にエラーが発生しました」
など言われてしまいます。これはマイクロソフトの方でも情報を公開していて、

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

Internet Explorer を使用して下記条件を満たすファイルを開いた場合、ファイル名が見つからない内容のエラーが発生し、ファイルを開くことができない場合があります。

* ダウンロード対象となるファイルに Content-Disposition:attachment ヘッダーを付加している
* Cache-Control:no-cache ヘッダーなどを使用して、ファイルのキャッシュを行わない設定をしている

弊社では、 TXT ファイル、DOC ファイル、CSV ファイル、XLS ファイル、PPT ファイル、PDF ファイル等のファイルでこの現象の発生を確認しております。
上記条件を満たすファイルへのリンクをクリックした場合、[ファイルのダウンロード] ダイアログが表示されます。
この時、[開く] および [保存] を選択しサンプル ファイルを開こうとすると、ファイルが見つからない内容のエラーが発生します。
尚、この際に表示されるエラーメッセージは関連付けられたアプリケーションによってことなります。


とのこと。

スクリプトからのヘッダ出力では私が確認したケースでは "Cache-Control:" は出力して
いなかったのですが、サーバの方でおそらく付与されているのでしょう。
というわけで、以下のヘッダを出力することで回避することが出来ました。

header( 'Cache-Control: Private' );


とりあえず Private で指定していますが、他のものでも no-cache でなければ問題ないかと思います。


2010.07.09 追記

なんかうまいこといってるはずが、Chrome(5.0), IE(8) で「ファイルが壊れています」の表示。
いろいろごちゃごちゃやってみて、Content-Length: を取ってみたらうまく動くことを確認。
問題は確かに解消したけど、ファイルサイズ不明だからダウンロード時にプログレスバー表示が
されないのね。なんかほかとも関連した問題なんだろうけど。
関連記事
スポンサーサイト

テーマ : PHP
ジャンル : コンピュータ

comment

管理者にだけメッセージを送る

検索フォーム
リンク
最新記事
最新コメント
カテゴリ
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。