1

私は Zend を使用しており、提供できるようにしたい webroot の外にいくつかのファイルがあります。私は 2 つの方法を試しましたが、どちらも IE 8 以下のバージョンを除くすべてのブラウザーで機能します。

私が試した2つの(実用的な)アプローチは次のとおりです。

  // Approach #1
  header('Content-Type: application/pdf');
  header("Pragma: ");
  header("Content-Disposition: attachment; filename=\"$filename\"");
  //header('Content-Transfer-Encoding: binary');
  header("Pragma: no-cache");
  header("Expires: 0");
  readfile($file);      

  // Approach #2
  $this->getResponse()
   ->setHeader('Content-Disposition', "attachment; filename=$filename")
  ->setHeader('Content-type', 'application/x-pdf');
  fpassthru($file);

私が言ったように、どちらのアプローチも最新のブラウザー (IE9 でさえも) では機能しますが、古いバージョンの IE では機能しません。私が得ているエラーは次のとおりです: http://cl.ly/image/1G3x370b1s09

このトピックに関するいくつかの投稿を調べて、数えきれないほどのさまざまなヘッダーの組み合わせを試しました。古いブラウザで問題を引き起こさない、この機能を処理するためのより確実な方法はありますか?

ありがとう!

4

3 に答える 3

3

私は以前にこれと戦ったことがあり、ヘッダーのキャッシュに起因すると思います。

ExpiresCache-Control(HTTP 1.1)、およびPragma(HTTP 1.0)の3つがあります。私の経験では、IEの古いバージョンでは、これら3つのヘッダーすべてが表示されます。送信する他のヘッダーやコンテンツの前に、以下を使用してみてください。

header("Cache-control: no-cache");
header("Pragma: no-cache");
header("Expires: -1");

Microsoftのこの記事では、キャッシングヘッダーについてさらに詳しく説明します。

これは私が過去にそれを機能させるためにしたことです:

$file = $fileInfo->openFile('r');
header("Pragma: public");
header("Cache-Control: public");
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="'.$file->getFilename().'"');
print $file->fpassthru()
于 2012-12-14T18:39:02.917 に答える
0

私の意志に反して、私はヘッダーと戦うことをあきらめ、ファイルのダウンロードを処理する方法を完全に変えました。ユーザーが今すぐファイルを要求すると、ファイルは一時的にハッシュされ、Webサーバーが表示できる領域にコピーされ、ユーザーはそのファイルにリダイレクトされ、ダウンロード領域を離れるとファイルは削除されます。それらが非アクティブになると、ファイルは設定された間隔で自動的に削除されます。

すべての入力kulishchに感謝します、そしてあなたがミネソタから来たのはどれほど皮肉なことですか!?ハッピーホリデー!

-ニコラス

于 2012-12-17T20:22:03.347 に答える
0

http://support.microsoft.com/default.aspx?scid=KB;EN-US;q316431&のアドバイスに従って、これらのヘッダーはうまくいきました。

header("Cache-control: max-age=3600, must-revalidate");
header("Pragma: public");
header("Expires: -1");

私はいつもこれに巻き込まれます!:(

于 2013-01-22T16:19:42.240 に答える