Yii 通過 CUploadedFile 封裝 $_FILES,提供類型、大小、副檔名驗證與安全存儲。
class Link extends CActiveRecord {
public $url; // 對應表單 file 欄位名
public function rules() {
return [
['url', 'file',
'allowEmpty' => true,
'types' => 'jpg, png, gif, pdf, doc, xls, zip, rar',
'maxSize' => 10 * 1024 * 1024, // 10MB
'tooLarge' => '檔案超過 10MB,請壓縮後上傳',
'wrongType' => '僅允許圖片/文檔/壓縮包格式',
],
// 其他欄位規則...
];
}
}
CHtml::activeFileFieldbeginWidget('CActiveForm', [
'id' => 'link-form',
'enableAjaxValidation' => false,
'htmlOptions' => ['enctype' => 'multipart/form-data'], // 必須
]); ?>
labelEx($model, 'url'); ?>
error($model, 'url'); ?>
endWidget(); ?>
public function actionCreate() {
$model = new Link;
if (isset($_POST['Link'])) {
$model->attributes = $_POST['Link'];
// 1. 獲取上傳文件實例
$file = CUploadedFile::getInstance($model, 'url');
// 2. 生成唯一存儲路徑
if ($file instanceof CUploadedFile) {
$ext = $file->extensionName; // 自動解析副檔名
$filename = 'file_' . time() . '_' . rand(1000, 9999) . '.' . $ext;
$savePath = Yii::app()->basePath . '/../assets/uploads/' . $filename;
$model->url = $savePath; // 存相對或絕對路徑入庫
} else {
$model->url = 'assets/uploads/noPic.jpg'; // 預設圖
}
// 3. 保存模型(入庫)
if ($model->save()) {
// 4. 實際移動臨時文件到目標目錄
if ($file instanceof CUploadedFile) {
$file->saveAs($savePath);
}
$this->redirect(['view', 'id' => $model->lid]);
}
}
$this->render('create', ['model' => $model]);
}
| 屬性 | 說明 |
|---|---|
name | 客戶端原始檔名 |
tempName | 伺服器臨時文件路徑 |
type | MIME 類型(如 image/jpeg) |
size | 文件大小(bytes) |
error | UPLOAD_ERR_* 錯誤碼 |
extensionName | 副檔名(不含點) |
hasError | 是否有錯誤 |
// View: name="files[]" multiple
echo CHtml::activeFileField($model, 'files[]', ['multiple' => true]);
// Controller
$files = CUploadedFile::getInstances($model, 'files');
foreach ($files as $file) {
// 同單文件邏輯循環處理
}
getimagesize() 確認圖片完整性assets/uploads 下 PHP 腳本執行saveAs() 替換為 OSS SDK 上傳,模型存 Object Key遵循「Model 驗證、View 編碼、Controller 落地」分層原則,配合隨機檔名與目錄執行權限隔離,構建安全可靠的上傳服務。