處理檔案上傳時,取得副檔名是基本需求。本文整理四種常見做法,並說明各自優缺點,幫助開發者選擇最適合的方式。
$imgname = $_FILES["file"]["name"];
$filetype = pathinfo($imgname, PATHINFO_EXTENSION);
$newname = date("Ymdhis") . "." . $filetype;
優點:內建函數、語意清晰、正確處理多點檔名(如 archive.tar.gz 只取 gz)。
缺點:需 PHP 4.0.3+ 版本(現代環境皆支援)。
$file = 'aaa.gif';
echo substr($file, strpos($file, '.') + 1);
缺點:若檔名含多個點(如 my.photo.jpg)會錯誤取得 photo.jpg;若無點會回傳整個字串。
$file = '111cn.gif';
$parts = explode('.', $file);
echo $parts[count($parts) - 1];
// 或封裝為函數
function getfix($filename) {
return end(explode('.', $filename));
}
缺點:同樣無法正確處理多點檔名;效能略低於 pathinfo()。
$extname = substr($upload_file_name, strpos($upload_file_name, ".") + 1);
注意:strpos() 找不到時回傳 false,需額外判斷;同樣有多點檔名問題。
pathinfo($filename, PATHINFO_EXTENSION),語意明確且正確處理邊界情況。uniqid() 或雜湊值避免衝突,而非單純用時間戳記。// 完整上傳處理範例
$allowed_ext = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
$filename = $_FILES['file']['name'];
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
if (in_array($ext, $allowed_ext)) {
$new_name = uniqid('upload_', true) . '.' . $ext;
move_uploaded_file($_FILES['file']['tmp_name'], "/uploads/{$new_name}");
}