解決Laravel Faker生成圖片失效
明明寫了要產生image圖檔,怎麼會沒有圖片呢?
簡單的說,此套件所使用的圖片來源是Lorempixel慢到不知道是不是掛了,導致他在抓取圖片時都會失敗,可惜套件作者已經封存此專案,詳細內容可以看他的文章,我們只好從套件上去做修改,而我使用的圖片來源是Lorem Picsum。
因為這個套件不是網站的主要功能,所以直接更改vendor是沒問題的,在正式站install也不用特地去做調整,除非你要在正式站產出假資料。
我們以最後release的版本為例
vendor/fzaninotto/faker/src/Provider/Image.php
在這邊會看到function image
是中也會使用function imageUrl
,所以我們只要修改imageUrl
,由於Lorem Picsum只有指定圖片沒有圖片分類,所以category
及word
可以關掉,如果要使用種子碼抓圖片的話,可以抽換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);
// 略
}
?>
這樣圖片就可以正常產生囉~