<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="photo" id="photo">
<input type="submit" value="上傳">
</form>
缺少 enctype="multipart/form-data" 將導致 $_FILES 為空。
import('ORG.Net.UploadFile');
$upload = new UploadFile();
// 基礎配置
$upload->maxSize = 3 * 1024 * 1024; // 3MB
$upload->allowExts = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
$upload->allowTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; // MIME 驗證
$upload->savePath = './Public/Uploads/'; // 絕對路徑更安全
$upload->saveRule = 'uniqid'; // 唯一文件名:uniqid + 微秒
$upload->hashType = 'md5_file'; // 可選:按內容哈希去重
// 縮略圖配置(僅圖片有效)
$upload->thumb = true;
$upload->thumbPrefix = 'thumb_'; // 前綴
$upload->thumbMaxWidth = 300;
$upload->thumbMaxHeight = 300;
$upload->thumbRemoveOrigin = false; // true 刪除原圖,僅保留縮略圖
$upload->thumbPath = './Public/Uploads/Thumb/'; // 縮略圖單獨目錄
// 多文件上傳(表單 name="photos[]")
// $upload->autoSub = true; // 按日期自動建子目錄:20240115/
// 執行上傳
if (!$upload->upload()) {
$this->error($upload->getErrorMsg()); // 如:非法文件類型、超過大小、寫入失敗
} else {
$info = $upload->getUploadFileInfo();
// $info = [
// ['name'=>'photo', 'savename'=>'5a1b2c3d.jpg', 'size'=>12345, 'type'=>'image/jpeg', ...],
// ...
// ]
$this->success('上傳成功', '', $info);
}
| 屬性 | 類型 | 說明 | 建議值 |
|---|---|---|---|
| maxSize | int | 最大字節數,0 不限制 | 2M-10M |
| allowExts | array | 允許副檔名(不含點) | ['jpg','png','pdf'] |
| allowTypes | array | 允許 MIME 類型(雙重驗證) | ['image/jpeg','application/pdf'] |
| saveRule | string | 命名規則:uniqid / time / hash / 自定義函數名 | 'uniqid' |
| autoSub | bool | 自動按日期建子目錄 | true |
| subType | string | 子目錄格式:date / custom | 'date' |
| thumb | bool | 生成縮略圖 | true |
| thumbMaxWidth/Height | int | 縮略圖最大寬高(等比縮放) | 300/300 |
| thumbRemoveOrigin | bool | 刪除原圖 | false |
| zipImages | bool | 上傳後自動壓縮圖片品質 | false |
location ~* \.php$ { deny all; },Apache: php_flag engine off)。finfo_file 或 getimagesize() 驗證真實文件類型,防止偽造副檔名。uniqid/hash 重命名。upload_max_filesize/post_max_size + 代碼 maxSize。
// 表單:
// 控制器
$upload->autoSub = true;
if ($upload->upload()) {
$files = $upload->getUploadFileInfo();
foreach ($files as $file) {
// 入庫記錄
M('Attachment')->add([
'module' => 'Article',
'filename' => $file['name'],
'savename' => $file['savename'],
'savepath' => $file['savepath'],
'size' => $file['size'],
'ext' => $file['extension'],
'create_time' => time(),
]);
}
}
ThinkPHP UploadFile 類功能完善,掌握 saveRule、thumb、autoSub、allowTypes 等核心屬性,配合目錄執行權限禁用、MIME 二次驗證、重命名存儲,即可構建安全可靠的文件上傳系統。ThinkPHP 5/6 請遷移至 think\File / think\facade\Filesystem 新組件。