尝试使用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()的相应视图文件
以下是我使用浏览器进行测试以及从zend返回的内容的屏幕截图。
关于zend的版本我使用的是2.2.5。
答案 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
发送了拉取请求,并添加了ImageStrategy
和ImageModel
。您可以查看here
<强>更新强>
我创建了一个可能对您有帮助的模块HtImgModule。阅读文档here。
答案 3 :(得分:0)
确保该行:
header('Content-type: image/jpg');
在任何输出之前。因此,请确保它位于readfile($path);
之前,并确保在打开<?php
标记之前没有任何空格或不可见字符。