2012-04-28 3 views
1

젠드에서 gzip 인코딩을 구현하려는 사람들로부터 많은 질문을 받고 있습니다.젠드에서 gzip 인코딩 제거하기

표준 Zend_Controller_Action을 확장하는 컨트롤러가 있습니다. 내 downloadAction에는 응답 본문으로 PDF 파일이 있습니다. 다운로드 한 파일이 클라이언트 브라우저에 의해 올바르게 인식되지 않는 것을 제외하면 잘 작동합니다.

다운로드 한 파일은 브라우저 다운로드로 '우편 보관함'으로 식별됩니다. 저장하고 두 번 클릭하면 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이 문제라고 생각하지 않지만 아래의 b.b3rn4rd의 게시물 에서처럼 content-type이'application/pdf '여야합니다. 옥텟 스트림으로 제공하면 어떤 파일 유형인지 알 수 없습니다. gzip이 Tim과 같은 서버 모듈에 의해 수행된다면, PHP 설정 범위를 벗어나는 일부 경우에는 gzip을 비활성화하기 위해 서버 설정을 조정해야합니다. – 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); 

} 
관련 문제