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

Php 访问ZF2中的响应(输出)头,php,zend-framework2,Php,Zend Framework2,尝试使用ZF2从受保护区域输出图像。在我的操作函数中,我通过调用以下命令输出图像数据: readfile$path 在浏览器中,此输出被识别为文本,并以jpeg标记“ÿØÿÿÿa…bla bla bla”开始显示。我假设这是因为Zend在HTTP头中返回了“text”内容类型 因此,我尝试使用php命令更改内容类型标题 标题“内容类型:图像/jpeg” 当我执行此操作时,会出现以下错误: Warning: Cannot modify header information - headers al

尝试使用ZF2从受保护区域输出图像。在我的操作函数中,我通过调用以下命令输出图像数据:

readfile$path

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

因此,我尝试使用php命令更改内容类型标题

标题“内容类型:图像/jpeg”

当我执行此操作时,会出现以下错误:

Warning: Cannot modify header information - headers already sent by (output started at /Zend/module/Application/src/Application/Controller/ImagesController.php:84)
我进行了广泛的研究,发现了很多这样的文档,似乎表明我可以做以下事情:

$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的相应视图文件

下面是我如何使用浏览器进行测试的一个屏幕帽,以及zend的反馈


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

请确保行:

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

在任何输出之前。因此,请确保它位于readfile$path之前;并确保在打开前没有任何空白或不可见字符确保行:

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

在任何输出之前。因此,请确保它位于readfile$path之前;并且确保在开场白前没有任何空白或不可见的字符使用应答,这是肯定的。可以调用header,并使用:

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

另外,返回响应以跳过渲染并完成分派事件。

一定要使用响应。可以调用header,并使用:

$response = $this->getResponse();
$response->setContent($imagedata);
$response
    ->getHeaders()
    ->addHeaderLine('Content-Type', 'image/png');
return $response;
另外,返回跳过渲染和完成分派事件的响应。

我认为应该使用与ViewModel和ImageStrategy类似的ImageModel

例如,从控制器

$image =  new ImageModel();
$image->setFileName('my_file_name.png');
return $image;
您应该创建ImageStrategyCustom View Strategy和ImageModel自己扩展ViewModel


我已经向WebUpThumb发送了一个pull请求,添加了ImageStrategy和ImageModel。您可以查看

更新

我创建了一个模块,这可能会对您有所帮助。阅读文档。

我认为您应该使用类似ImageModel的工具来查看模型和ImageStrategy

例如,从控制器

$image =  new ImageModel();
$image->setFileName('my_file_name.png');
return $image;
您应该创建ImageStrategyCustom View Strategy和ImageModel自己扩展ViewModel


我已经向WebUpThumb发送了一个pull请求,添加了ImageStrategy和ImageModel。您可以查看

更新

我创建了一个模块,这可能会对您有所帮助。阅读文档。

更新:

原始答复:

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

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

原始答复:

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

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

谢谢你的回复。我在上面添加了我的控制器代码,以向您确切地显示发生了什么。它仍然返回对Undefined方法错误的调用。@smDeveloper它肯定与在调用头“Content-type:image/png”之前发送的某些输出有关;。我不认为Zend会在调用您的操作之前发送任何输出,所以在调用之前必须有一些空格。在使用Zend这样的框架时,这样更改头不是一个好主意,因为它提供了正确的方式来完成此操作的通行费感谢您的响应。我在上面添加了我的控制器代码,以向您确切地显示发生了什么。它仍然返回对Undefined方法错误的调用。@smDeveloper它肯定与在调用头“Content-type:image/png”之前发送的某些输出有关;。我不认为Zend会在您的操作被调用之前发送任何输出,所以在您的操作之前必须有一些空白。在使用Zend这样的框架时,这样更改标题不是一个好主意,因为它提供了正确的方法,我尝试了这一点,但它没有更改标题,我验证了标题仍然是内容类型:text/html;charset=UTF-8是否返回响应而不是依赖默认的ViewModel?我用这种策略就像吃面包和黄油一样。您使用的是什么版本的ZF2?>面包和黄油。是的,应该很容易同意。我在上面添加了很多细节,可以回答您的问题。Zend Framework版本是2.2.5,我试过了,但它没有改变我确认的标题仍然是内容类型:text/html;charset=UTF-8是否返回响应而不是依赖默认的ViewModel?我用这种策略就像吃面包和黄油一样。您使用的是什么版本的ZF2?>面包和黄油。是的,应该很容易同意。我补充说
上面有很多细节可以回答你的问题。Zend Framework版本是2.2.5,请您进一步解释一下如何创建ImageStrategy和ImageModel。我已经向WebInOphThumb发送了一个pull请求,添加了ImageStrategy和ImageModel。您可以在这里查看,这可能会对您有所帮助。您能进一步解释一下如何创建ImageStrategy和ImageModel吗?我已经向WebinoPhpThumb发送了一个pull请求,添加了ImageStrategy和ImageModel。您可以在这里查看,这可能会对您有所帮助。谢谢这确实改变了返回的标题,解决了我的原始问题,但仍然没有改变我的数据显示为图像。我还为内容长度添加了一个标题,因为它将该值设置为1。当我使用filesize$路径设置长度时,它返回所有图像数据,但以字符串形式返回。换句话说,它不是返回二进制数据,而是将二进制数据转换为字符串数据。因此,现在我似乎在用$imageData=file\u get\u contents$path读取图像并用$response->setContent$imageData设置它的部分遇到了问题。试试这个:$response->getHeaders->addHeaderLine'Content-Transfer-Encoding'、'binary'->addHeaderLine'Content-Type','image/png'->addHeaderLine'Content-Length',mb_strlen$imageContent;谢谢这确实改变了返回的标题,解决了我的原始问题,但仍然没有改变我的数据显示为图像。我还为内容长度添加了一个标题,因为它将该值设置为1。当我使用filesize$路径设置长度时,它返回所有图像数据,但以字符串形式返回。换句话说,它不是返回二进制数据,而是将二进制数据转换为字符串数据。因此,现在我似乎在用$imageData=file\u get\u contents$path读取图像并用$response->setContent$imageData设置它的部分遇到了问题。试试这个:$response->getHeaders->addHeaderLine'Content-Transfer-Encoding'、'binary'->addHeaderLine'Content-Type','image/png'->addHeaderLine'Content-Length',mb_strlen$imageContent;在侧注上,在控制器中,您可以在侧注上使用$this->params'table'或$this->params->fromRoute'table',在控制器中,您可以使用$this->params'table'或$this->params->fromRoute'table'