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

Yii CUploadedFile 圖片上傳完整指南:模型驗證、視圖表單與控制器處理

     編輯:PHP 相關知識

MVC 三層協作上傳流程

Yii 通過 CUploadedFile 封裝 $_FILES,提供類型、大小、副檔名驗證與安全存儲。

1. Model 定義驗證規則

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' => '僅允許圖片/文檔/壓縮包格式',
      ],
      // 其他欄位規則...
    ];
  }
}

2. View 使用 CHtml::activeFileField

beginWidget('CActiveForm', [
  'id' => 'link-form',
  'enableAjaxValidation' => false,
  'htmlOptions' => ['enctype' => 'multipart/form-data'], // 必須
]); ?>

labelEx($model, 'url'); ?> error($model, 'url'); ?>
endWidget(); ?>

3. Controller 處理上傳與存儲

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]);
}

CUploadedFile 核心屬性速查

屬性說明
name客戶端原始檔名
tempName伺服器臨時文件路徑
typeMIME 類型(如 image/jpeg)
size文件大小(bytes)
errorUPLOAD_ERR_* 錯誤碼
extensionName副檔名(不含點)
hasError是否有錯誤

進階:多文件上傳

// View: name="files[]" multiple
echo CHtml::activeFileField($model, 'files[]', ['multiple' => true]);

// Controller
$files = CUploadedFile::getInstances($model, 'files');
foreach ($files as $file) {
  // 同單文件邏輯循環處理
}

安全與效能清單

  1. 驗證 MIME + 副檔名雙重檢查:Model rules 已含,控制器可再次 getimagesize() 確認圖片完整性
  2. 儲存目錄不可執行:Nginx/Apache 禁用 assets/uploads 下 PHP 腳本執行
  3. 檔名隨機化:避免覆蓋、路徑遍歷、資訊洩露
  4. 大文件分片/斷點續傳:超過 50MB 建議前端分片 + 後端合併,或引入 Resumable.js + 專用端點
  5. 雲存儲對接:saveAs() 替換為 OSS SDK 上傳,模型存 Object Key

遵循「Model 驗證、View 編碼、Controller 落地」分層原則,配合隨機檔名與目錄執行權限隔離,構建安全可靠的上傳服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved