如何使用 Laminas MVC 输出 php 图片资源?
How can I output a php image resource using Laminas MVC?
我目前输出这样的图像(在控制器内 class):
ob_start();
header("Content-Type: image/gif");
imagegif($image_resource);
imagedestroy($image_resource);
$content_string = ob_get_clean();
$this->getResponse()->setContent($content_string);
有没有更好的方法而不实际捕获输出缓冲区?因为这不是很容易测试...
在没有 output-buffer 的情况下捕获图像的唯一方法是将图像写入文件:
$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() method, and got the filename via stream_get_metadata() 函数创建了一个临时文件。然后我将文件的内容加载到字符串变量中并关闭了 tmpfile 的文件句柄,因此它被删除了。
一种更优化的方式,从建议写入 php://memory file instead. The is a small explanation in another question 何时使用 php://memory 和 php://temp
// 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);
就我个人而言,我会使用输出缓冲区,但将代码移至单独的函数或 class。这样您就可以出于测试目的隔离和模拟其行为:
/** @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);
无论如何,我建议您在响应 object 上设置 header 而不是手动编写:
$this->getResponse()->getHeaders()->addHeaders([
'Content-Type' => 'image/gif',
]);
$this->getResponse()->setContent($content_string);
这样 header 框架会在正确的时间将输出输出到浏览器,并且输出缓冲不会有任何问题。
我目前输出这样的图像(在控制器内 class):
ob_start();
header("Content-Type: image/gif");
imagegif($image_resource);
imagedestroy($image_resource);
$content_string = ob_get_clean();
$this->getResponse()->setContent($content_string);
有没有更好的方法而不实际捕获输出缓冲区?因为这不是很容易测试...
在没有 output-buffer 的情况下捕获图像的唯一方法是将图像写入文件:
$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() method, and got the filename via stream_get_metadata() 函数创建了一个临时文件。然后我将文件的内容加载到字符串变量中并关闭了 tmpfile 的文件句柄,因此它被删除了。
一种更优化的方式,从建议写入 php://memory file instead. The is a small explanation in another question 何时使用 php://memory 和 php://temp
// 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);
就我个人而言,我会使用输出缓冲区,但将代码移至单独的函数或 class。这样您就可以出于测试目的隔离和模拟其行为:
/** @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);
无论如何,我建议您在响应 object 上设置 header 而不是手动编写:
$this->getResponse()->getHeaders()->addHeaders([
'Content-Type' => 'image/gif',
]);
$this->getResponse()->setContent($content_string);
这样 header 框架会在正确的时间将输出输出到浏览器,并且输出缓冲不会有任何问题。