在 PHP 專案中處理檔案上傳是常見需求。雖然網路上有許多現成函式庫,但自己撰寫一個輕量級的上傳類別,不僅能精準掌握每個細節,還能依專案需求彈性擴充。本文將帶您逐步建構一個功能完整的 ieb_upload 類別,涵蓋檔案驗證、隨機重命名、縮圖產生、路徑管理等核心功能。
首先定義類別所需的屬性,分別對應表單欄位名稱、儲存目錄、大小限制、上傳狀態旗標、錯誤代碼、最終檔名與縮圖檔名:
class ieb_upload {
var $FormName; // 表單 file 欄位名稱
var $Directroy; // 上傳目標目錄
var $MaxSize; // 允許最大位元組數
var $CanUpload; // 是否通過初步檢查
var $doUpFile; // 最終儲存的檔案名稱
var $sm_File; // 縮圖檔案名稱
var $Error; // 錯誤代碼
// ...
}
建構子接受三個參數(表單名稱、目錄路徑、大小上限),並執行基本驗證:
function ieb_upload($formName='', $dirPath='', $maxSize=2097152) {
global $FormName, $Directroy, $MaxSize, $CanUpload, $Error, $doUpFile, $sm_File;
$FormName = $formName;
$MaxSize = $maxSize;
$CanUpload = true;
$doUpFile = '';
$sm_File = '';
$Error = 0;
if ($formName == '') {
$CanUpload = false;
$Error = 1;
return;
}
$Directroy = ($dirPath == '') ? $dirPath : $dirPath . '/';
}
scanFile()使用 is_readable() 確認暫存檔是否可讀,若不可讀則設定錯誤碼 2。
getSize($format='B')支援 B、KB、MB 三種單位回傳,若檔案大小為 0 則設定錯誤碼 3 並禁止上傳。
透過 pathinfo() 或 $_FILES['type'] 取得,配合白名單機制過濾危險副檔名(如 .php、.exe)。
採用 date('YmdHis') . rand(1000,9999) 產生唯一檔名,避免衝突與資安風險。
利用 GD 函式庫 imagecreatetruecolor()、imagecopyresampled() 等函式,依指定寬高等比例縮放,並輸出為 JPEG/PNG 格式。
$upload = new ieb_upload('myFile', 'uploads/', 5*1024*1024); // 5 MB
if ($upload->CanUpload) {
$upload->scanFile();
if ($upload->CanUpload) {
$newName = $upload->doUpload(); // 執行實際移動與縮圖
echo "上傳成功:{$upload->doUpFile}";
if ($upload->sm_File) echo ",縮圖:{$upload->sm_File}";
} else {
echo "錯誤代碼:{$upload->Error}";
}
}
open_basedir 限制 PHP 讀寫範圍。這個 ieb_upload 類別雖然精簡,卻涵蓋了實務上最常見的上傳需求。您可以依專案繼續擴充:支援多檔案、雲端儲存(S3/OSS)、斷點續傳、病毒掃描整合等。自行撰寫核心元件,不僅能深入理解 PHP 檔案處理機制,也能在未來維護時更得心應手。