1. 程式人生 > 實用技巧 >ThinkPHP裡無法輸出圖片 設定響應頭

ThinkPHP裡無法輸出圖片 設定響應頭

今天寫了一個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論壇網友的一句話

框架的定義就是在於更快速、便捷地開發應用
如果我使用了某款框架還是需要自己去注意條條款款,然後定義或修正許多形式上的規範,那還用框架幹嘛呢
本末倒置,雞蛋裡面挑骨頭