我正在编写一个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;
?>
答案 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
路由,那么用户可能可以绕过该路由,因此请注意您对此的限制控制器。