2012-04-28 6 views
1

Zendでgzipエンコーディングを実装しようとしている人からの質問がたくさんあります。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ヘッダーを無効にするにはどうしたらいいですか、それともスティックの端が間違っていたら(ユーザーエクスペリエンスを犠牲にするのではなく、圧縮を使用するのが良いでしょう)圧縮が取り消されたら、クライアントにダウンロードしたファイルを正しく認識させるにはどうすればよいですか?

+0

コンテンツはどのように最初にgzipされていますか? mod_deflateのようなサーバーサイドで、すべてのページを圧縮していますか? –

+0

gzipは問題ではないと思っていますが、content-typeはb.b3rn4rdの記事のように 'application/pdf'でなければなりません。オクテットストリームとして提供する場合、それはそれがどのタイプのファイルであるかを知らない。 gzipがTimのようなサーバーモジュールで実行されている場合は、PHPの範囲外である場合もあるため、サーバーの設定を変更して無効にする必要があります。 – drew010

+0

私はgzippingがどこで起こっているのか正確にはわかりません。サーバレベルで何も指定されていません。サーバから直接ダウンロードすると(PHP/Zendの外で)うまく動作します。これは、Zendが応答を処理するどこかの場所です。 gzipエンコーディングでは、FirefoxとChromeの両方のダウンロードが失敗します。 Operaは動作します。 b.b3rn4rdの答えは私のためにそれを解決しました。 gzipとcontent-typeの両方が問題を引き起こしていました。 – Grokling

答えて

3

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

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); 

} 
関連する問題