1

Zend で gzip エンコーディングを実装しようとしている人々から多くの質問が寄せられています - 私は反対のことをする必要があります!

標準の Zend_Controller_Action を拡張するコントローラーがあります。私の downloadAction には、応答本文として PDF ファイルがあります。ダウンロードしたファイルがクライアント ブラウザによって正しく認識されないことを除いて、これはうまく機能します。

ダウンロードされたファイルは、ブラウザのダウンロードによって「Zip アーカイブ」として識別されます。保存してダブルクリックすると、PDF として正しく開きます。応答ヘッダーは Content-Encoding:gzip を示しているので、それが原因である可能性が高いと思います。

私の行動の核心は次のとおりです。

$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);

if ($fd = fopen($pdfpath.$pdf->Filename,'r')) 
    {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="summary.PDF"');
        while(!feof($fd)) 
        {
           $buffer = fread($fd, 2048);
           echo $buffer;
        }
        fclose($fd);
    }

この部分の前に別のコードがありますが、変数に値を設定することほど興味深いことはありません。

この応答だけで Content-Encoding:gzip ヘッダーを無効にするにはどうすればよいですか、またはそれが間違っている場合 (圧縮を使用するのは良いことですが、ユーザーエクスペリエンスを犠牲にすることはありません)、どうすれば取得できますか?圧縮が元に戻されたら、クライアントはダウンロードしたファイルを正しく識別できますか?

4

1 に答える 1

3

header() 関数の代わりにフレームワークを使用することをお勧めしますZend_Controller_Response_Http。通常、すべての応答に対して Bootstrap で gzip 圧縮などの「デフォルト」ヘッダーを指定し、いくつかの特別な理由でアクションでそれらをオーバーライドします。

public function indexAction()
{
      $frontContoller = $this->getFrontController(); 
      $this->_helper->layout()->disableLayout();
      $this->_helper->viewRenderer->setNoRender(true);
      $response = new Zend_Controller_Response_Http();
      $response
        ->setHeader('Content-Type', 'application/pdf')
        ->setHeader('Content-Disposition', 'attachment; filename=summary.pdf')
        ->setHeader('Expires', ''.gmdate('D, d M Y H:i:s', strtotime('31.08.1986')) . ' GMT', true)
        ->setHeader('Cache-Control', 'no-cache')
        ->setHeader('Pragma', 'no-cache', true);

      $response->setBody(file_get_contents('/full/path/to/summary.pdf'));
      $frontContoller->setResponse($response);

}
于 2012-04-28T07:41:02.827 に答える