Php Zend Framework вынужденной загрузки - PullRequest
1 голос
/ 23 июня 2010

Я должен установить простой менеджер загрузок и я не понимаю, почему этот код не работает:

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

         }


    }

пока с закомментированным кодом скрипт работает нормально.

Ответы [ 2 ]

5 голосов
/ 23 июня 2010

Вы в основном не производите вывод через 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));
}

Кстати, вам придется снова закомментировать ваши первые две строки кода и не выходить из системы (0), иначе это не будет работать, поскольку фактическая отправка заголовкови тело будет сделано после действия.

0 голосов
/ 23 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...