2010-06-23 3 views
1

я должен создать простой менеджер загрузки , и я не понимаю, whay этот код не работает:рамки Зенд Php 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

Не могли бы вы описать, что «это не работает». Появляются какие-то ошибки? Или файл отображается вместо загрузки? –

ответ

0

Лично я не понимаю, почему ваш код должен работать? Должен ли readfile() автоматически запускать метод sendHeaders() или writeHeaders() в объекте $ response перед выпуском содержимого файла?!? Я думаю, вам следует вызвать этот метод или использовать метод, который его называет ... как и предлагаемый $ this-> getResponse-> setBody() в другом ответе

+0

@Felix Kling Он показывает файл, а не загружает его @ greg0ire Я никогда не использовал объект ответа таким образом, и я не нашел никакого учебника, не могли бы вы показать мне пример ? – whisher

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

+0

Я прокомментировал эту строку $ layout = Zend_Controller_Action_HelperBroker :: getStaticHelper ('Layout'); $ view = Zend_Controller_Action_HelperBroker :: getStaticHelper ('viewRenderer'); $ layout-> disableLayout(); $ view-> setNoRender (true); Это плагин. – whisher

+0

Это дает 0-байтовый файл в Chrome. Изменение линии на это заставило ее работать: -> setHeader ('Content-Length', filesize ($ file), true); –

Смежные вопросы