【发布时间】:2015-01-09 16:48:37
【问题描述】:
尝试使用 ZF2 从受保护区域输出图像。在我的动作函数中,我通过调用来输出图像数据:
readfile($path);
在浏览器中,此输出被识别为文本并以 jpeg 标记“ÿØÿà...bla bla bla”开始显示。我假设这是因为 Zend 在 HTTP 标头中返回了“文本”内容类型。
然后我尝试使用 php 命令更改内容类型标头
header('Content-type: image/jpeg');
当我这样做时,我收到以下错误:
Warning: Cannot modify header information - headers already sent by (output started at /Zend/module/Application/src/Application/Controller/ImagesController.php:84)
我进行了广泛的查看,发现了很多像 this 这样的文档,似乎说我可以做这样的事情:
$this->getResponse()->setHeader('Content-Type', 'image/jpeg');
当我这样做时,我会收到消息:
Fatal error: Call to undefined method Zend\Http\PhpEnvironment\Response::setHeader() in /Zend/module/Application/src/Application/Controller/ImagesController.php on line 39
查看响应对象结构,我看不到 Zend\Http\Headers 和 Zend\Http\Response 对象或 Zend\Http\PhpEnvironment\Response 对象之间的任何链接,所以 php 不能找到对 setHeader() 的调用。
我的问题是如何更改输出标题以使浏览器期望图像数据?
这是我响应第一个答案的代码。它不使用视图,因为它只是输出二进制数据:
class ImagesController extends AbstractActionController {
public function getfileAction() {
$path = '/data/images/theImage.jpg';
header('Content-type: image/png');
//$this->getResponse()->setHeader('Content-Type:', 'image/jpeg');
readfile($path);
exit; }}
作为对 Saeven 的回复,这里是我对您的解决方案的确切实施:
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Session\Container;
use Zend\View\Model\ViewModel;
use Zend\Http\Response;
use Zend\Http\Headers as Headers;
class ImagesController extends AbstractActionController {
public function getfileAction() {
$table = $this->getEvent()->getRouteMatch()->getParam('table');
$fileName = $this->getEvent()->getRouteMatch()->getParam('filename');
$path = '/datasm/apps/php/data/'.$table.'/'.$fileName;
$imageData = file_get_contents($path);
$response = $this->getResponse();
$response->setContent($imageData);
$response->getHeaders()->addHeaderLine('Content-Type', 'image/png');
return $response;
}
}
这是我的项目的屏幕截图,显示我没有 getfileAction() 的相应视图文件
这是我如何使用浏览器进行测试以及从 zend 返回的内容的屏幕截图。
关于 zend 的版本,我使用的是 2.2.5。
【问题讨论】:
-
附注,在控制器中你可以使用 $this->params('table') 或 $this->params()->fromRoute('table')
标签: php zend-framework2