首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Php zend框架强制下载

Php zend框架强制下载
EN

Stack Overflow用户
提问于 2010-06-23 16:02:16
回答 2查看 2.5K关注 0票数 1

我应该设置一个简单的下载管理器,我不明白这段代码哪里不能工作:

代码语言:javascript
运行
复制
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);*/

         }


    }

而使用注释代码时,脚本工作得很好。

EN

回答 2

Stack Overflow用户

发布于 2010-06-23 17:06:43

您基本上不会通过Zend框架执行任何输出(除了头文件)。尝试以下操作:

代码语言:javascript
运行
复制
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));
}

顺便说一句,你将不得不再次注释掉你的前两行代码,并且不要使用exit(0),否则它将无法工作,因为实际的头和正文的发送将在动作后完成。

票数 5
EN

Stack Overflow用户

发布于 2010-06-23 16:36:45

就我个人而言,我不明白为什么你的代码应该正常工作?在输出文件内容之前,readfile()是否应该在$response对象上自动触发sendHeaders()或writeHeaders()方法?!?我认为你应该调用这个方法或者使用一个调用它的方法...就像另一个答案中建议的$this->getResponse->setBody()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3099895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档