访问ZF2中的响应(输出)标头

时间:2014-01-31 21:50:15

标签: php zend-framework2

尝试使用ZF2从受保护区域输出图像。在我的动作功能中,我通过调用输出图像数据:

readfile($path);

在浏览器中,此输出被识别为文本,并以jpegmarkers'ÿØÿà... bla bla bla'开头显示。我假设这是因为Zend在HTTP标头中返回了“text”内容类型。

然后我尝试用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()的调用。

我的问题是如何更改输出标题以使borwser期望图像数据?

这是我的代码,以回应第一个答案。它不使用视图,因为它只是输出二进制数据:

    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()的相应视图文件 no view file for getFileAction

以下是我使用浏览器进行测试以及从zend返回的内容的屏幕截图。

output at the browser

关于zend的版本我使用的是2.2.5。

4 个答案:

答案 0 :(得分:2)

<强>更新:

$response
    ->getHeaders()
    ->addHeaderLine('Content-Transfer-Encoding', 'binary')
    ->addHeaderLine('Content-Type', 'image/png')
    ->addHeaderLine('Content-Length', mb_strlen($imageContent));

原始答案:

这是我用于xml文件的内容:

$response = new \Zend\Http\Response();
$response->getHeaders()->addHeaderLine('Content-Type', 'text/xml; charset=utf-8');
$response->setContent($xml);
return $response;

答案 1 :(得分:1)

绝对使用回复。可以调用header(),并使用:

$response = $this->getResponse();
$response->setContent($imagedata);
$response
    ->getHeaders()
    ->addHeaderLine('Content-Type', 'image/png');
return $response;

此外,返回响应以跳过RENDER和FINISH调度事件。

答案 2 :(得分:1)

我认为你应该使用ImageModel(类似于ViewModel)和ImageStrategy

例如,从您的控制器

$image =  new ImageModel();
$image->setFileName('my_file_name.png');
return $image;

您应该自己创建ImageStrategy(自定义视图策略)和ImageModel(只是扩展ViewModel)。

我已向WebinoPhpThumb发送了拉取请求,并添加了ImageStrategyImageModel。您可以查看here

<强>更新

我创建了一个可能对您有帮助的模块HtImgModule。阅读文档here

答案 3 :(得分:0)

确保该行:

header('Content-type: image/jpg');

在任何输出之前。因此,请确保它位于readfile($path);之前,并确保在打开<?php标记之前没有任何空格或不可见字符。