我目前輸出這樣的影像(在控制器類中):
ob_start();
header("Content-Type: image/gif");
imagegif($image_resource);
imagedestroy($image_resource);
$content_string = ob_get_clean();
$this->getResponse()->setContent($content_string);
有沒有更好的方法而不實際捕獲輸出緩沖區?因為這不是很可測驗...
uj5u.com熱心網友回復:
在沒有輸出緩沖區的情況下捕獲影像的唯一方法是將影像寫入檔案:
$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()方法創建了一個臨時檔案,并通過stream_get_metadata()函式獲取了檔案名。然后我將檔案的內容加載到字串變數中,并關閉 tmpfile 的檔案句柄,以便將其洗掉。
我個人會使用輸出緩沖區,但將代碼移動到單獨的函式或類中。這樣您就可以隔離和模擬其行為以進行測驗:
/** @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);
無論如何,我建議您在回應物件上設定標頭,而不是手動撰寫它:
$this->getResponse()->getHeaders()->addHeaders([
'Content-Type' => 'image/gif',
]);
$this->getResponse()->setContent($content_string);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/404885.html
標籤:
