【问题标题】:ZEND - Issue with download file (encoding, not able to open downloaded file)ZEND - 下载文件问题(编码,无法打开下载的文件)
【发布时间】:2011-12-05 19:10:46
【问题描述】:

我在我的项目中制作了一个下载表单,但问题是当我下载文件并尝试打开它时,Zend 渲染器正在向其中添加我的布局 html 代码...我读到我必须禁用渲染器和布局.但问题是我必须在我自己的助手中执行此操作,而不是在控制器文件中,因为我需要在该助手文件中下载。 我的下载功能是这样的:

<?php
class Zend_View_Helper_EditArticles extends Zend_View_Helper_Abstract
{
    public function EditArticles()
    {
        //some code here, getting data from db table

        //and now the download
        if (isset($_POST['downloadarticle' . $i])) {
            //this is probably bad and its not working as it should
            //(?)Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true);
            //(?)Zend_Controller_Action_HelperBroker::getStaticHelper('layout')->disableLayout();

            $targetPath = $_SERVER['DOCUMENT_ROOT'] . '/articles/';
            $file = $articles->GetArticleToDownload($_POST['art_id' . $i]);

            $name = $file['name'];
            $path = $file['path'];
            $getfile = str_replace('//', '/', $targetPath) . $path . '.pdf';
            $size = $file['size'];

            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header("Content-Disposition: attachment; filename=$name.pdf");
            header("Content-length: $size");
            header('Content-Transfer-Encoding: binary');
            readfile($getfile);
            break;
        }
    }

echo $this->view->partial('/index/index.phtml','EditArticles');

当我下载 PDF 时,Adobe Reader 无法打开它(当我下载其他文件时,它们也无法打开)。我用记事本打开它们,在PDF内容之前有很多HTML布局代码......我做错了什么?

在 Adob​​e Reader 中,我收到以下消息:

Adobe Reader 无法打开“filename.pdf”,因为它不是受支持的文件类型,或者因为文件已损坏,例如,它作为电子邮件附件发送且未正确解码)。

【问题讨论】:

    标签: zend-framework download view-helpers


    【解决方案1】:

    该代码不属于视图助手。它属于控制器或可能是 action 助手。

    在你的控制器中这样的东西应该可以工作:

    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender(true);
    
    // ...
    
    $this->getResponse()
        ->setHeader('Content-Description', 'File Transfer', true)
        ->setHeader('Content-Type', 'application/pdf', true) // change to application/pdf
        ->setHeader('Content-Disposition', "attachment; filename={$name}.pdf", true)
        ->setHeader('Content-length', $size, true)
        ->setHeader('Content-Transfer-Encoding', 'binary', true)
        ->appendBody(readfile($getfile));
    

    【讨论】:

    • 好的,但如果我把它放在我的主控制器文件中,它将禁用我所有应用程序的视图:) 奇特的技巧是我在模块中使用助手而不是控制器,可以放在任何模块中网站和布局的位置由其他控制器呈现,下载操作也在其他情况下是助手而不是控制器(模块)。无论如何,我决定创建一个下载控制器并通过 $_GET 方法将要下载的文件 id 传递给它,并在该控制器中进行所有下载,它应该可以正常工作。
    【解决方案2】:

    以下 2 行代码应该可以完成您需要的工作,并且可以在您的 Zend 应用程序的任何地方工作。

    Zend_Layout::getMvcInstance()->disableLayout();
    Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);
    

    【讨论】:

    • 当我把它放在我的帮助文件中时它没有像我预期的那样工作:) 我认为问题是我在其他控制器中渲染布局并在其他模块中下载文件也在这种情况下帮助器安装控制器并在此处禁用布局不要禁用主控制器布局
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多