如何使用ZendFramework 1输出文本文件?

时间:2014-02-24 15:13:37

标签: xml zend-framework

我正在编写一个ZendFramework(1.4)应用程序,我需要在其中显示特定文件的内容。这是我的代码:

public function showfileAction()
{
        $this->_helper->layout->disableLayout();
        $configOptions = $this->getInvokeArg('bootstrap')->getOptions();

        $file = $configOptions['files']['dir'] . $this->getRequest()->getParam('file');
        if ( is_readable( $file ) ) {
            foreach ( $this->getRequest()->getParam('headers') as $h => $v ) {
                $this->getResponse()->setHeader( $h, $v );
            }
            $this->view->file_contents = file_get_contents($file);
        } else {
            $this->_redirect ('/not-found');
        }
}

我想要显示的特定文件是一个xml(我尝试了几种具有相同结果的不同内容类型),我得到的是文件由标签字符预先添加的内容(!),在xml的情况下,导致这样的错误(取自谷歌浏览器):

error on line 1 at column 6: XML declaration allowed only at the start of the document.

我的档案内容:

<?xml version="1.0"?>
<users>
    <user>XXXX</user>
</users>

我得到的结果:

    <?xml version="1.0"?>
<users>
    <user>XXXX</user>
</users>

这是showfile.phtml

<?php
echo $this->file_contents;
?>

1 个答案:

答案 0 :(得分:3)

没有必要使用视图脚本,所以我可能会改变你所拥有的:

public function showfileAction()
{
    $this->getHelper('viewRenderer')->setNoRender(true);
    $this->getHelper('layout')->disableLayout();

    $configOptions = $this->getInvokeArg('bootstrap')->getOptions();

    $file = $configOptions['files']['dir'] . $this->getRequest()->getParam('file');
    if ( is_readable( $file ) ) {
        foreach ( $this->getRequest()->getParam('headers') as $h => $v ) {
            $this->getResponse()->setHeader( $h, $v );
        }
        $this->getResponse()->setBody(file_get_contents($file));
    } else {
        $this->_redirect ('/not-found');
    }
}

如果stray选项卡不在您正在呈现的XML文件中,则可能是在应用程序中某个PHP文件的关闭?>之后由空格引起的。没有一种简单的方法可以找出哪一个 - 最佳实践是省略纯PHP文件中的最后?>以避免此问题。

关于安全性的另一个警告 - 即使您认为您的路由限制已经足够,如果您的应用仍然使用默认的:controller/:action路由,那么用户可能可以绕过该路由,因此请注意您对此的限制控制器。