ThinkPHP 內建 UploadFile 類別支援多檔案上傳,只需在表單將 name 設為陣列 name="photo[]" 或不同名稱 name="photo1"、name="photo2"。本文示範完整實作:圖片自動生成多尺寸縮圖、視頻檔案分開儲存、模型自動完成回調整合。
<form action=":U('Upload/index')" method="post" enctype="multipart/form-data">
<div>圖片 (可多張):<input type="file" name="image[]" multiple></div>
<div>視頻 (可多個):<input type="file" name="video[]" multiple></div>
<button type="submit">上傳</button>
</form>
<?php
class UploadModel extends Model {
protected $info = '';
// 自動完成:表單提交時自動呼叫 upload()、videoupload()
protected $_auto = [
['image', 'upload', self::MODEL_BOTH, 'callback'], // 圖片欄位
['video', 'videoupload', self::MODEL_BOTH, 'callback'], // 視頻欄位
];
// ========== 圖片上傳處理 ==========
protected function upload() {
$imgNames = $_FILES['image']['name'] ?? [];
// 過濾空值
$imgNames = array_filter($imgNames);
if (empty($imgNames)) return false;
import('ORG.Net.UploadFile');
$upload = new UploadFile();
$upload->saveRule = 'time'; // 檔名規則:時間戳
$upload->allowExts = ['jpg', 'gif', 'png', 'jpeg', 'webp'];
$upload->thumb = true; // 啟用縮圖
$upload->thumbPrefix = '250_115_,150_110_,213_156_'; // 縮圖前綴
$upload->thumbMaxWidth = '250,150,213'; // 三種寬度
$upload->thumbMaxHeight = '115,110,156'; // 三種高度
$upload->savePath = './Public/upload/images/'; // 圖片儲存路徑
$upload->videoPath = './Public/upload/video/'; // 視頻路徑 (備用)
if (!$upload->upload()) {
$this->error = $upload->getErrorMsg();
return false;
}
$this->info = $upload->getUploadFileInfo(); // 取得上傳資訊陣列
// 回傳第一張圖片的儲存檔名 (供資料庫 image 欄位存儲)
return $this->info[0]['savename'] ?? false;
}
// ========== 視頻上傳處理 ==========
protected function videoupload() {
$vidNames = $_FILES['video']['name'] ?? [];
$vidNames = array_filter($vidNames);
if (empty($vidNames)) return false;
// 這裡沿用上方 $this->info (若圖片與視頻同時上傳)
// 實務建議分開實例化 UploadFile 處理視頻
return $this->info[0]['savename'] ?? false;
}
}
?>
<?php
class UploadController extends Controller {
public function index() {
$model = D('Upload');
if ($model->create()) { // 自動驗證 + 自動完成 (含 upload/videoupload)
$id = $model->add(); // 寫入資料庫
if ($id) {
$this->success('上傳成功', U('index'));
} else {
$this->error('資料庫寫入失敗');
}
} else {
$this->error($model->getError());
}
}
}
?>
| 屬性 | 用途 | 常用值 |
|---|---|---|
savePath | 檔案儲存目錄 (需可寫入) | ./Public/upload/ |
saveRule | 檔名命名規則 | time, uniqid, md5, 自訂函數 |
allowExts | 允許副檔名陣列 | ['jpg','png','gif'] |
thumb | 是否生成縮圖 | true/false |
thumbPrefix | 縮圖檔名前綴 (多尺寸用逗號分隔) | '200_200_,100_100_' |
thumbMaxWidth/Height | 縮圖最大寬高 (對應 prefix 順序) | '200,100' |
thumbRemoveOrigin | 是否刪除原圖 | false (預設保留) |
maxSize | 單檔最大位元組 | 2097152 (2MB) |
hashType | 檔案雜湊驗證 | md5, sha1 |