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

我建议使用框架Zend_Controller_Response_Http而不是 header() 函数,通常我在我的引导程序中为所有响应指定带有 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 回答