關鍵點:form 必須設 enctype
<?php $form=$this->beginWidget('CActiveForm', [
'id'=>'books-form',
'enableAjaxValidation'=>false,
'htmlOptions'=>['enctype'=>'multipart/form-data'],
]); ?>
視圖中渲染文件輸入框
<div class="row">
<?= $form->labelEx($model,'BookImg') ?>
<?= CHtml::activeFileField($model,'BookImg') ?>
<?= $form->error($model,'BookImg') ?>
</div>
<!-- 圖片預覽 -->
<div class="row">
<?php if ($model->BookImg): ?>
<img src="<?= Yii::app()->baseUrl . '/' . $model->BookImg ?>" alt="preview" />
<?php endif; ?>
</div>
控制器處理上傳
if ($model->save()) {
$image = CUploadedFile::getInstance($model, 'BookImg');
if ($image instanceof CUploadedFile) {
$savePath = "D:/uploads/{$model->BookId}.{$image->extensionName}";
$image->saveAs($savePath);
// 可選:更新模型存儲相對路徑
$model->BookImg = "uploads/{$model->BookId}.{$image->extensionName}";
$model->save(false); // 跳過驗證
}
$this->redirect(['view', 'id'=>$model->BookId]);
}
模型驗證規則(限制類型、大小)
public function rules() {
return [
['BookImg', 'file',
'allowEmpty'=>true,
'types'=>'jpg, gif, png',
'maxSize'=>1024*1024, // 1MB
'tooLarge'=>'文件大於 1MB,請上傳較小文件。',
],
];
}
注意事項
activeFileField 僅渲染 <input type="file">,**不會自動上傳**,需在控制器調用 CUploadedFile::getInstance() 處理。
- 修改操作時,若用戶未選新文件,
getInstance 返回 null,應保留原有文件路徑。
- Linux 環境確保上傳目錄對 Web 服務器用戶可寫(
chmod 775 + 正確 owner)。