ThinkPHP裡無法輸出圖片 設定響應頭
阿新 • • 發佈:2020-08-22
今天寫了一個PHP生成圖片,想用瀏覽器檢視,但是每次開啟都是一串亂碼,看樣子是圖片源二進位制資料,然後查看了下響應頭是text/html,那我明明設定了image/jpeg
header("Content-type", "image/jpeg");
這說明TP預設設定了text/html,查了官方文件,啥也沒說,去網上查,才知道TP有個Response類,預設所有控制器輸出text/html,官方文件啥也沒說,只好自己去翻Response這個類了
ThinkPHP6\vendor\topthink\framework\src\think\Response.php
基類Response被這幾個類繼承,我試了下File類,但是這個File是輸出檔案,瀏覽器直接下載了
$file = new File('123.jpg');
$response = $file->mimeType('image/jpeg');
throw new HttpResponseException($response);
在看看基類Response
/** * 建立Response物件 * @access public * @param mixed $data 輸出資料 * @param string $type 輸出型別 * @param int $code 狀態碼 * @return Response */ public static function create($data = '', string $type = 'html', int $code = 200): Response { $class = false !== strpos($type, '\\') ? $type : '\\think\\response\\' . ucfirst(strtolower($type)); return Container::getInstance()->invokeClass($class, [$data, $code]); }
這裡是自動找response目錄下的響應類,但我只想設定一個響應頭來顯示我的圖片,文件翻遍了沒找到方法,然後看了看目錄下的Html類,那我們可以自己寫一個自定義類來輸出自己想要的響應格式
/** * Html Response */ class Html extends Response { /** * 輸出type * @var string */ protected $contentType = 'text/html'; public function __construct(Cookie $cookie, $data = '', int $code = 200) { $this->init($data, $code); $this->cookie = $cookie; } }
於是我在response目錄寫了一個Jpeg類
/**
* Html Response
*/
class Jpeg extends Response
{
/**
* 輸出type
* @var string
*/
protected $contentType = 'image/jpeg';
public function __construct(Cookie $cookie, $data = '', int $code = 200)
{
$this->init($data, $code);
$this->cookie = $cookie;
}
}
可以輸出圖片了
$response = Response::create('', 'Jpeg');
$image->blob('JPEG');
throw new HttpResponseException($response);
也許有辦法不用這麼麻煩,但是TP官方文件啥也沒有寫,一下子也找不到其他方法,導致我的header()函式都沒用了,這裡引用ThinkPHP論壇網友的一句話
框架的定義就是在於更快速、便捷地開發應用
如果我使用了某款框架還是需要自己去注意條條款款,然後定義或修正許多形式上的規範,那還用框架幹嘛呢
本末倒置,雞蛋裡面挑骨頭