前端表單
<form action="<?= $this->createUrl('/upload/default/upload') ?>" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="hidden" name="dir" value="<?= Yii::app()->controller->currentDir ?>" />
<input type="submit" value="Upload Image" />
</form>
後端控制器
public function actionUpload() {
$this->currentDir = isset($_REQUEST['dir']) ? $_REQUEST['dir'] : '';
$image = CUploadedFile::getInstanceByName('file');
$path = $this->uploadPath . '/' . $this->currentDir . '/' . $image->name;
$image->saveAs($path);
$this->redirect(['index', 'dir' => $this->currentDir]);
}
CUploadedFile 核心方法
getInstance($model, 'attribute'):綁定模型屬性獲取(配合 CHtml::activeFileField)。
getInstanceByName('inputName'):直接通過 name 獲取,無需模型。
上傳對象屬性
| 屬性 | 說明 |
name | 原始文件名 |
size | 文件大小(字節) |
type | MIME 類型 |
tempName | 臨時文件路徑 |
error | 上傳錯誤代碼 |
extensionName | 副檔名 |
hasError | 是否有錯誤 |
安全建議
- **驗證 MIME 與副檔名**,防止偽裝腳本上傳。
- **重命名存儲**(如
uniqid().'.'.$ext),避免覆蓋與路徑遍歷。
- **存放目錄設為不可執行**(Nginx/Apache 禁用 PHP 解析)。
- 模型層用
CFileValidator 限制類型、大小:['file', 'types'=>'jpg,png', 'maxSize'=>1024*1024]。