getimagesize() 是 PHP 內建**零相依**函數,能從本地檔案或遠端 URL 讀取圖片標頭,**不載入完整圖片到記憶體**,瞬間取得寬高、類型、MIME、HTML 屬性字串。本文詳細說明回傳陣列結構、常數對照、遠端讀取、錯誤處理與實戰應用場景。
成功回傳 **7 元素陣列**(索引 0~6 + 關聯鍵),失敗回傳 false 並觸發 E_WARNING。
| 索引/鍵 | 說明 | 範例 |
|---|---|---|
0 / width | 寬度 (px) | 800 |
1 / height | 高度 (px) | 600 |
2 / type | 圖片類型常數 (1~17) | 2 (IMAGETYPE_JPEG) |
| 3 | HTML 屬性字串 width="800" height="600" | width="800" height="600" |
mime | MIME 類型 | image/jpeg |
channels | 通道數 (3=RGB, 4=RGBA/CMYK) | 3 |
bits | 每色位元深度 | 8 |
1 => IMAGETYPE_GIF
2 => IMAGETYPE_JPEG
3 => IMAGETYPE_PNG
4 => IMAGETYPE_SWF
5 => IMAGETYPE_PSD
6 => IMAGETYPE_BMP
7 => IMAGETYPE_TIFF_II (intel byte order)
8 => IMAGETYPE_TIFF_MM (motorola byte order)
9 => IMAGETYPE_JPC
10 => IMAGETYPE_JP2
11 => IMAGETYPE_JPX
12 => IMAGETYPE_JB2
13 => IMAGETYPE_SWC
14 => IMAGETYPE_IFF
15 => IMAGETYPE_WBMP
16 => IMAGETYPE_XBM
17 => IMAGETYPE_ICO
<?php
$file = 'photo.jpg';
$info = @getimagesize($file);
if ($info === false) {
die('無法讀取圖片或非支援格式');
}
// 直接輸出 img 標籤
echo '<img src="' . $file . '" ' . $info[3] . ' alt="">';
// 等同於
printf('<img src="%s" width="%d" height="%d" alt="">', $file, $info[0], $info[1]);
// 判斷類型
if ($info[2] === IMAGETYPE_JPEG) {
echo 'JPEG 圖片';
}
// 取得 MIME (適合 header 輸出)
header('Content-Type: ' . $info['mime']);
// readfile($file);
支援 https://、https://、ftp:// 封裝協定(需 allow_url_fopen=On)。**僅下載標頭資料**,不會下載完整檔案,速度極快。
$url = 'https://example.com/banner.png';
$info = @getimagesize($url);
if ($info) {
echo "遠端圖片:{$info[0]}x{$info[1]} {$info['mime']}";
}
function validateImageUpload(array $file, array $rules = []): array {
$rules += [
'max_width' => 4096,
'max_height' => 4096,
'min_width' => 1,
'min_height' => 1,
'allowed_types' => [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_WEBP],
'max_size' => 5 * 1024 * 1024, // 5MB
];
// 1. 檔案大小
if ($file['size'] > $rules['max_size']) return ['ok'=>false, 'msg'=>'檔案過大'];
// 2. getimagesize 驗證真實圖片格式與尺寸
$info = @getimagesize($file['tmp_name']);
if ($info === false) return ['ok'=>false, 'msg'=>'非有效圖片檔案'];
if (!in_array($info[2], $rules['allowed_types'], true)) return ['ok'=>false, 'msg'=>'不支援的圖片格式'];
if ($info[0] < $rules['min_width'] || $info[0] > $rules['max_width']) return ['ok'=>false, 'msg'=>'寬度不符'];
if ($info[1] < $rules['min_height'] || $info[1] > $rules['max_height']) return ['ok'=>false, 'msg'=>'高度不符'];
// 3. 可選:檢查 MIME 是否與副檔名一致 (防偽裝)
$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
$expectedMime = ['jpg'=>'image/jpeg','jpeg'=>'image/jpeg','png'=>'image/png','gif'=>'image/gif','webp'=>'image/webp'];
if (isset($expectedMime[$ext]) && $expectedMime[$ext] !== $info['mime']) {
return ['ok'=>false, 'msg'=>'副檔名與實際格式不符'];
}
return ['ok'=>true, 'info'=>$info];
}
| 問題 | 原因/解決 |
|---|---|
| 回傳 false 但檔案存在 | 非支援格式、檔案損壞、權限不足、allow_url_fopen=Off 讀遠端 |
| SVG 回傳 false | PHP 內建不支援 SVG,需自行解析 XML 或用 Imagick |
| 大型圖片 (超過 2^31 px) 溢位 | 極罕見,改用 Imagick::getImageGeometry() |
| 效能:頻繁呼叫 | 快取結果(檔案 mtime + size 作為 key),避免重複統計 |
getimagesize() 以**零成本、高效能、標準化**特性,成為 PHP 圖片上傳驗證、縮圖前置檢查、HTML 圖片屬性自動填入的首選工具。