首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Laminas输出php映像资源?

如何使用Laminas输出php映像资源?
EN

Stack Overflow用户
提问于 2022-01-07 10:27:57
回答 1查看 252关注 0票数 1

我目前输出的图像如下(在控制器类中):

代码语言:javascript
复制
    ob_start();
    header("Content-Type: image/gif");
    imagegif($image_resource);
    imagedestroy($image_resource);
    $content_string = ob_get_clean();
    $this->getResponse()->setContent($content_string);

是否有更好的方法而不实际捕获输出缓冲区?因为这不是很好的测试..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-07 13:45:07

在没有输出缓冲区的情况下捕获映像的唯一方法是将图像写入文件:

代码语言:javascript
复制
$tmpFile = tmpfile();
$path = stream_get_meta_data($tmpFile)['uri'];
imagegif($image_resource, $tmpFile);
$content_string = file_get_contents($path);
imagedestroy($image_resource);
fclose($tmpFile);

$this->getResponse()->setContent($content_string);

我用tmpfile()方法创建了一个临时文件,并通过元数据()函数获得了文件名。然后,我将文件的内容加载到string变量中,并将文件句柄关闭到tmpfile,以便将其删除。

一种从注释到php://内存文件的更优化的方法。这是另一个问题中关于何时使用php://内存和php://temp的一个小解释。

代码语言:javascript
复制
// open in memory file
$handle = fopen('php://memory', 'r+');
imagegif($im, $handle);
// reset file handle
fseek($handle, 0);

// get filesize
$stat = fstat($handle);
$size = $stat['size'];

// read the created file into variable
$fileContent = fread($handle, $size);
fclose($handle);

// write filecontent to the response object
$this->getResponse()->setContent($content_string);

就我个人而言,我会使用输出缓冲区,但是将代码移动到一个单独的函数或类中。这样,您就可以为测试目的隔离和模拟它的行为:

代码语言:javascript
复制
/** @var GDImage|resource $image */
function getImage($image): string
{
   ob_start();
   imagegif($image);
   $returnData = ob_get_contents();
   ob_end_clean();
   imagedestroy($image);
   return $returnData;
}
$content_string = getImage($image_resource);
$this->getResponse()->setContent($content_string);

无论如何,我建议您在响应对象上设置头部,而不是手动编写它:

代码语言:javascript
复制
$this->getResponse()->getHeaders()->addHeaders([
    'Content-Type' => 'image/gif',
]);
$this->getResponse()->setContent($content_string);

通过这种方式,标头将在正确的时间通过框架输出到浏览器,并且输出缓冲不会有任何问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70619840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档