檔案上傳是專案常見需求。ThinkPHP UploadFile 類提供豐富配置選項,支援多檔、縮圖、類型限制、重命名規則等。本文提供完整實作範例。
select();
$this->assign('filelist', $list);
$this->display();
}
// 上傳處理
public function upload() {
if (empty($_FILES)) {
$this->error('請選擇上傳檔案');
}
$uploadInfo = $this->_doUpload();
if ($uploadInfo) {
if ($this->_saveToDb($uploadInfo)) {
$this->success('上傳成功');
} else {
$this->error('資料庫寫入失敗');
}
} else {
$this->error('上傳異常');
}
}
/** 執行上傳核心邏輯 */
private function _doUpload() {
import('@.ORG.UploadFile'); // 需將 UploadFile.class.php 放入 Lib/ORG/
$upload = new UploadFile();
$upload->maxSize = 1000000; // 1MB
$upload->savePath = './Public/Upload/'; // 儲存路徑 (建議與入口同級)
$upload->saveRule = 'uniqid'; // 唯一檔名規則
$upload->uploadReplace = true; // 同名覆蓋
$upload->allowExts = ['jpg','jpeg','png','gif']; // 允許副檔名
$upload->allowTypes = ['image/png','image/jpg','image/jpeg','image/gif']; // MIME 類型
// 縮圖配置
$upload->thumb = true;
$upload->thumbMaxWidth = '300,500'; // 多尺寸寬度
$upload->thumbMaxHeight = '200,400'; // 多尺寸高度
$upload->thumbPrefix = 's_,m_'; // 縮圖前綴
$upload->thumbRemoveOrigin = true; // 刪除原圖 (僅保留縮圖)
if ($upload->upload()) {
return $upload->getUploadFileInfo(); // 回傳上傳資訊陣列
} else {
$this->error($upload->getErrorMsg());
return false;
}
}
/** 寫入資料庫 */
private function _saveToDb($data) {
$file = M('file');
$success = 0;
// $data 最後一元素可能為空,實際筆數為 count-1
for ($i = 0; $i < count($data) - 1; $i++) {
$fileData['filename'] = $data[$i]['savename'];
if ($file->data($fileData)->add()) {
$success++;
}
}
return $success === count($data) - 1;
}
}
?>
小圖:
中圖:
| 屬性 | 說明 | 預設值 |
|---|---|---|
maxSize | 最大檔案大小 (bytes),-1 不限制 | -1 |
savePath | 儲存目錄 (需可寫權限) | ./Uploads/ |
saveRule | 檔名生成規則:uniqid、time、md5、自訂函式名 | uniqid |
allowExts | 允許副檔名陣列 (不含點) | [] |
allowTypes | 允許 MIME 類型陣列 (二次驗證) | [] |
thumb | 是否生成縮圖 | false |
thumbMaxWidth/Height | 縮圖最大尺寸,逗號分隔支援多尺寸 | '' |
thumbPrefix | 縮圖前綴,對應多尺寸 | 'thumb_' |
thumbRemoveOrigin | 生成縮圖後刪除原檔 | false |
uploadReplace | 同名檔案是否覆蓋 | false |
$_FILES['type'] 來自瀏覽器,不可信。建議用 finfo_file() 或 getimagesize() 二次驗證檔案真實類型。php_flag engine off),防止上傳木馬執行。此範例展示了 ThinkPHP 檔案上傳的標準流程,實際專案請根據業務調整驗證規則、儲存策略與錯誤處理。