ThinkPHP 3.x 核心類庫路徑:ThinkPHP/Lib/ORG/Net/Http.class.php。使用 import('ORG.Net.Http') 自動載入。
<?php
namespace Home\Model; // 假設放在 Model 層
use Think\Model;
class ImageModel extends Model {
/**
* 獲取書籍封面圖片:優先用本地快取,無則遠端下載
* @param string $isbn 國際標準書號
* @return string 本地圖片相對路徑
*/
public function getCover(string $isbn): string {
// 1. 查資料庫現有記錄
$book = $this->where("isbn='$isbn'")->find();
if ($book && $book['image']) {
return $book['image']; // 已有本地圖片
}
// 2. 遠端獲取圖片 URL (Amazon API 等)
$remote = \Com\Buyback\QueryAmazon::getImage($isbn); // 外部服務類
if (empty($remote['ImageURL'])) {
return 'Public/bookcover/unknownbook.png'; // 預設圖
}
// 3. 本地儲存路徑規劃
$localPath = "Public/bookcover/{$isbn}.jpg";
$fullPath = realpath('.') . "/$localPath";
// 4. 核心:Http::curl_download 遠端下載到本地
// 參數:$remoteUrl, $localFilePath
$result = \ORG\Net\Http::curl_download($remote['ImageURL'], $fullPath);
if ($result) {
// 5. 更新資料庫記錄
$data = ['inform_id' => $book['inform_id'] ?? 0, 'image' => $localPath];
$book ? $this->save($data) : $this->add($data);
return $localPath;
}
return 'Public/bookcover/unknownbook.png'; // 下載失敗回退
}
}
public static function curl_download($url, $savePath) {
$ch = curl_init($url);
$fp = fopen($savePath, 'wb'); // 二進制寫入
curl_setopt_array($ch, [
CURLOPT_FILE => $fp,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false, // 內網/測試環境可關閉,生產建議開啟
]);
$ret = curl_exec($ch);
fclose($fp);
curl_close($ch);
return $ret !== false && filesize($savePath) > 0;
}
Public/bookcover/ 存在且可寫 (mkdir -p、chmod 755)。think\Request、think\facade\Http 或 Guzzle 封裝。guzzlehttp/guzzle:Http::get($url)->sink($savePath) 更現代、功能豐富。ThinkPHP 內建 Http 類提供簡單的 curl_download 靜態方法,適合輕量級遠端圖片拉取。實務中注意目錄權限、異步處理、錯誤重試與版本遷移。新專案建議直接使用 Guzzle 等成熟 HTTP 客戶端。