明明寫了要產生image圖檔,怎麼會沒有圖片呢?

簡單的說,此套件所使用的圖片來源是Lorempixel慢到不知道是不是掛了,導致他在抓取圖片時都會失敗,可惜套件作者已經封存此專案,詳細內容可以看他的文章,我們只好從套件上去做修改,而我使用的圖片來源是Lorem Picsum

因為這個套件不是網站的主要功能,所以直接更改vendor是沒問題的,在正式站install也不用特地去做調整,除非你要在正式站產出假資料。

我們以最後release的版本為例
vendor/fzaninotto/faker/src/Provider/Image.php

在這邊會看到function image是中也會使用function imageUrl,所以我們只要修改imageUrl,由於Lorem Picsum只有指定圖片沒有圖片分類,所以categoryword可以關掉,如果要使用種子碼抓圖片的話,可以抽換randomize成字串,記得連同function image一起抽換。

相同種子碼只會對應一張照片

<?php
    public static function imageUrl($width = 640, $height = 480, $category = null, $randomize = '', $word = null, $gray = false)
    {
        // 將原本 https://lorempixel.com/ 替換成 https://picsum.photos/
        $baseUrl = "https://picsum.photos/";
        $url = "{$width}/{$height}/";
        
        if($randomize){
            $url = "seed/" . $randomize . "/" . $url;
        }

        // 灰階圖片則這樣修改
        if ($gray) {
            $url = $url . "?grayscale";
        }

        return $baseUrl . $url;
    }

這樣修改還沒結束,Lorem Picsum回應圖片時會以301轉址到圖片,但套件中沒有處理此狀況,直接生成下去會拿不到圖片,修改如下。

<?php
    public static function image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = '', $word = null, $gray = false){
        // 略
            // use cURL
            $fp = fopen($filepath, 'w');
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_FILE, $fp);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 加入此段code即可
            $success = curl_exec($ch) && curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200;
            fclose($fp);
            curl_close($ch);
        // 略
    }
?>

這樣圖片就可以正常產生囉~

參考資料

Lorempixel.com is down #2071