4

私は IE6 でかなり興味深い (そして苛立たしい) 問題に遭遇しました。サーバーで生成された pdf を提供し、PHP でヘッダーを設定して、ブラウザーでファイルを強制的にダウンロードします。Windows ユーザー アカウントが標準ユーザー (つまり、管理者ではない) に設定されている場合のみ、IE6 を除いてすべて正常に動作します。

これは企業環境用であるため、もちろんすべてのアカウントがこのように設定されています。奇妙なことは、ダウンロード ダイアログで Content-Type が認識されないことです。

header( 'Pragma: public' );
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );
header( 'Cache-Control: public' );
header( 'Content-Description: File Transfer' );
header( 'Content-Type: application/pdf' );
header( 'Content-Disposition: attachment; filename="xxx.pdf"' );
header( 'Content-Transfer-Encoding: binary' );
echo $content;
exit;

また、最初にファイルの内容を一時ファイルに書き込もうとしたのでContent-Length、ヘッダーに設定することもできましたが、それは役に立ちませんでした。

4

10 に答える 10

4

これらのヘッダーは偽物です!

Content-Transfer-Encoding: binary

このヘッダーは、電子メール ヘッダーからコピーされます。HTTP にはバイナリ以外の転送モードがないという理由だけで、HTTP には適用されません。それを設定することは、設定するのと同じくらい理にかなっていますX-Bits-Per-Byte: 8

Cache-control: pre-check=0, post-check=0

これらの非標準値は、IE がキャッシュされたコンテンツがまだ最新かどうかを確認するタイミングを定義します。0がデフォルトなので、これを設定する0のは時間の無駄です。これらのディレクティブは、キャッシュ可能なコンテンツにのみ適用され、キャッシュ不可にしたかったことを示唆していますExpires:0must-revalidate

Content-Description: File Transfer

これは別の電子メールの模倣です。設計上、このヘッダーはダウンロードにはまったく影響しません。これは単なる有益な自由形式のテキストです。X-Hi-Mom: I'm sending you a file!技術的にはヘッダーと同じくらい便利です。

header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );
header( 'Cache-Control: public' );

PHP では、2 行目で最初の行を完全に上書きします。あなたは暗闇の中で刺しているようです。

本当に何が違うのか

Content-Disposition: attachment

そこにファイル名を挿入する必要はありません (使用mod_rewriteまたはindex.php/fakefilename.docトリックを使用できます。これにより、特殊文字のサポートが大幅に向上し、オプションの Content-Dispositionヘッダーを無視するブラウザーで動作します)。

IE では、ファイルがキャッシュ内にあるかどうか (「開く」はキャッシュ不可能なファイルでは機能しません) と、ユーザーが IE が検出するファイルの種類をサポートすると主張するプラグインを持っているかどうかによって違いが生じます。

キャッシュを無効にするにはCache-control:no-cache(20 個の余分な偽のヘッダーなしで) 必要なだけで、ファイルをキャッシュ可能にするために何も送信する必要はありません。

注意: PHP にはsession.cache_limiternone.

ini_set('session.cache_limiter','none'); // tell PHP to stop screwing up HTTP
于 2009-04-08T18:14:30.653 に答える
3

IE のいくつかのバージョンは

header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );

ダウンロードしたコンテンツがプラグインに渡されて表示される前に、ダウンロードしたコンテンツを削除してください。

この2つを外せば大丈夫です。

また、Acrobat の一部のバージョンではこれに苦労しているように見えるため、PDF を扱う場合はサーバー側の GZIP 圧縮を使用していないことを確認してください。

ここでは漠然としていますが、上記のヒントは、バーコードを含む動的に構築された PDF を提供する Web アプリケーションを使用して得た実際の経験に基づいています。影響を受けるバージョンはわかりません。上記の 2 つの「トリック」を使用すると、サポート コールがなくなることだけはわかります:p

于 2008-09-08T08:38:20.623 に答える
1

この投稿に時間を割いていただきありがとうございます。私はいくつかの組み合わせを試し、ついにsymfonyプロジェクトを機能させました。ここでは、誰かが同じ問題を抱えている場合に備えて、解決策を投稿します。

public function download(sfResponse $response) {

        $response->clearHttpHeaders();
        $response->setHttpHeader('Pragma: public', true);
        $response->addCacheControlHttpHeader("Cache-control","private");        
        $response->setContentType('application/octet-stream', true);
        $response->setHttpHeader('Content-Length', filesize(sfConfig::get('sf_web_dir') .       sfConfig::get('app_paths_docPdf') . $this->getFilename()), true);
        $response->setHttpHeader("Content-Disposition", "attachment; filename=\"". $this->getFilename() ."\"");
        $response->setHttpHeader('Content-Transfer-Encoding', 'binary', true);
        $response->setHttpHeader("Content-Description","File Transfer");
        $response->sendHttpHeaders();
        $response->setContent(readfile(sfConfig::get('sf_web_dir') . sfConfig::get('app_paths_docPdf') . $this->getFilename()));

        return sfView::NONE;
}

これは、IE6、IE7、Chrome、Firefoxで問題なく機能します。

これが誰かを助けることを願っています。

于 2011-04-20T15:12:00.240 に答える
1

私は約1年前にまったく同じ問題を抱えていました。多くのグーグルと調査の後、(Javaコードからの)ヘッダーは次のようにIE6とPDFを探します:

    response.setHeader("Content-Type", "application/pdf "; name=" + file.getName());
    response.setContentType("application/pdf");
    response.setHeader("Last-Modified", getHeaderDate(file.getFile());
    response.setHeader("Content-Length", file.getLength());

他のすべてをドロップします。

明らかに、IE6、キャッシング、強制ダウンロード、およびプラグインには、少しおかしなところがあります。これがうまくいくことを願っています...私にとっての小さな違いは、リクエストが最初にFlash SWFファイルから来ることです。しかし、それは問題ではありません。

于 2008-09-08T08:23:41.297 に答える
0

サーバーがURLに読み取らない追加のパラメーターを追加することもできます。

http://www.mycom.com/services/pdf?action=blahblah&filename=pdf0001.pdf

私は、つまり、どのヘッダーよりも URL の末尾にあるファイル名を読み取る可能性が高い場合に遭遇しました。

于 2008-09-25T17:31:01.470 に答える
0

SSL を使用している場合:

キャッシュ制御 (またはプラグマ) ヘッダーが含まれていないことを確認してください。IE6 には、キャッシュ制御ヘッダーが使用されている場合にユーザーがファイルをダウンロードできないというバグがあります。エラー メッセージが表示されます。

私はこれで2日間髪を伸ばしたので、このメッセージが誰かに役立つことを願っています.

于 2010-02-03T15:28:43.637 に答える
0

同様の問題がありましたが、正確には関連していない可能性があります。私の問題は、IE6 がファイル名の特殊文字 (特にスラッシュ) に問題があるように見えることでした。これらを削除すると、問題が修正されました。

于 2009-07-28T18:49:12.923 に答える
0

次のJavaコードは私にとってはうまくいきます(Firefox 2および3、IE 6および7でテスト済み):

response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
response.setContentType(getServletContext().getMimeType(file.getName()));
response.setContentLength(file.length());

他のヘッダーはまったく必要ありませんでした。また、gzip 圧縮をオンとオフの両方で (圧縮を行う別のサーブレット フィルターを使用して) このコードをテストしました。違いはありません (私がテストした 4 つのブラウザーでは問題なく動作します)。さらに、これは他のファイルタイプでも機能します。

于 2008-09-25T17:25:11.717 に答える
0

pilif が既に述べているように、サーバー側の gzip 圧縮を必ずオフにしてください。私にとって、これは PDF ファイル (他の種類の中でも特に) で問題を引き起こし、Internet Explorer と FireFox の両方で .zip ファイルでも、あまり目立たない理由で問題を引き起こしました。

私が知る限り、zip フッターの最後のビットが (少なくとも FireFox によって) 取り除かれ、フォーマットが破損していました。

PHP では、次のコードを使用できます。

ini_set("zlib.output_compression",0);
于 2008-09-16T13:48:22.930 に答える
0

このコンテンツタイプに切り替えるだけで機能します。また、プラグマが「キャッシュなし」と等しくないものに設定されていることを確認してください

header( 'Content-type: application/octet-stream'); # force download, no matter what mimetype
header( 'Content-Transfer-Encoding: binary' ); # is always ok, also for plain text
于 2010-09-21T09:35:37.560 に答える