首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Yii 1.x 使用 CHtml::activeFileField 實現模型綁定文件上傳

     編輯:PHP 相關知識

關鍵點: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)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved