ZEND - проблема с загрузкой файла (кодировка, не удается открыть загруженный файл) - PullRequest
2 голосов
/ 05 декабря 2011

Я сделал форму загрузки в своем проекте, но проблема в том, что когда я загружаю файл и пытаюсь открыть его, Zend Renderer добавляет к нему мой 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-кода ... Что я делаю не так?

В Adobe Reader я получаю это сообщение:

Adobe Reader не удалось открыть файл «filename.pdf», поскольку он либо не поддерживается типом файла, либо, например, из-за того, что файл был поврежден, он был отправлен как вложение электронной почты и неправильно декодирован).

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Этот код не принадлежит помощнику вида.Он принадлежит контроллеру или может быть action helper.

Что-то вроде этого в вашем контроллере должно работать:

$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));
0 голосов
/ 05 декабря 2011

Следующие 2 строки кода должны выполнить то, что вам нужно, и сделать это способом, который работает из любой точки вашего Zend-приложения.

Zend_Layout::getMvcInstance()->disableLayout();
Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...