2010-06-23 117 views
1

我應該建立一個簡單的下載管理器 ,我不明白這whay代碼不起作用:PHP Zend框架forcedownload

protected function doDownload($filename){ 
     //$this->_helper->layout()->disableLayout(); 
     //$this->_helper->viewRenderer->setNoRender(true); 
     $dir = Zend_Registry::get('dir'); 
     $file = $dir->assets.$filename; 
     if(file_exists($file)){ 
      $response = $this->getResponse(); 
      $response->setHeader('Content-Description','File Transfer', true); 
      $response->setHeader('Content-Type','application/octet-stream', true); 
      $response->setHeader('Content-Disposition','attachment; filename='.basename($file), true); 
      $response->setHeader('Content-Transfer-Encoding','binary', true); 
      $response->setHeader('Expires','0', true); 
      $response->setHeader('Cache-Control','must-revalidate, post-check=0, pre-check=0', true); 
      $response->setHeader('Pragma','public', true); 
      $response->setHeader('Content-Length: ' , filesize($file),true); 
      ob_clean(); 
      flush(); 
      readfile($file); 
      exit(0); 
      /*header('Content-Description: File Transfer'); 
      header('Content-Type: application/octet-stream'); 
      header('Content-Disposition: attachment; filename='.basename($file)); 
      header('Content-Transfer-Encoding: binary'); 
      header('Expires: 0'); 
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
      header('Pragma: public'); 
      header('Content-Length: ' . filesize($file)); 
      ob_clean(); 
      flush(); 
      readfile($file); 
      exit(0);*/ 

     } 


    } 

同時與註釋代碼腳本工作正常。

+1

你能更「描述」它不起作用嗎?彈出任何錯誤?或者顯示文件而不是下載? – 2010-06-23 08:15:39

回答

0

個人而言,我不明白爲什麼你的代碼應該工作?應該在輸出文件內容之前,readfile()自動觸發$ response對象上的sendHeaders()或writeHeaders()方法?!?我認爲你應該調用這種方法或使用一種方法調用它...像在其他答案中建議的$ this-> getResponse-> setBody()

+0

@Felix Kling 它顯示的文件,而不是下載它 @ greg0ire 我從來沒有用這種方式使用響應對象,我沒有找到任何教程,你可以告訴我一個 例子嗎? – whisher 2010-06-23 09:28:08

5

您基本上不會通過Zend Framework執行任何輸出(除了你的標題)。請嘗試以下操作:

if (file_exists($file)) { 
    $this->getResponse() 
     ->setHeader('Content-Description','File Transfer', true) 
     ->setHeader('Content-Type','application/octet-stream', true) 
     ->setHeader('Content-Disposition','attachment; filename='.basename($file), true) 
     ->setHeader('Content-Transfer-Encoding','binary', true) 
     ->setHeader('Expires','0', true) 
     ->setHeader('Cache-Control','must-revalidate, post-check=0, pre-check=0', true) 
     ->setHeader('Pragma','public', true) 
     ->setHeader('Content-Length: ' , filesize($file),true); 
    $this->getResponse()->setBody(file_get_contents($file)); 
} 

BTW你將不得不再次註釋掉的代碼的前兩行,不離開我們(0),否則將無法正常工作,因爲實際的標題和正文發送將在行動後完成。

+0

感謝大家,它工作正常。 再見。 – whisher 2010-06-23 09:34:39

+0

我註釋掉了這一行 $ layout = Zend_Controller_Action_HelperBroker :: getStaticHelper('Layout'); $ view = Zend_Controller_Action_HelperBroker :: getStaticHelper('viewRenderer'); $ layout-> disableLayout(); $ view-> setNoRender(true); 這是一個插件。 – whisher 2010-06-23 09:48:18

+0

這在Chrome中給出了一個0字節的文件。改變這一行使它工作: - > setHeader('Content-Length',filesize($ file),true); – 2014-03-26 15:59:28