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

ThinkPHP 多檔案上傳完整實作:圖片縮圖、視頻上傳、陣列欄位處理

     編輯:PHP 綜合知識

前言

ThinkPHP 內建 UploadFile 類別支援多檔案上傳,只需在表單將 name 設為陣列 name="photo[]" 或不同名稱 name="photo1"、name="photo2"。本文示範完整實作:圖片自動生成多尺寸縮圖、視頻檔案分開儲存、模型自動完成回調整合。

前端表單 (HTML)

<form action=":U('Upload/index')" method="post" enctype="multipart/form-data">
    <div>圖片 (可多張):<input type="file" name="image[]" multiple></div>
    <div>視頻 (可多個):<input type="file" name="video[]" multiple></div>
    <button type="submit">上傳</button>
</form>

模型自動完成配置 (Model/UploadModel.class.php)

<?php
class UploadModel extends Model {
    protected $info = '';

    // 自動完成:表單提交時自動呼叫 upload()、videoupload()
    protected $_auto = [
        ['image', 'upload', self::MODEL_BOTH, 'callback'],   // 圖片欄位
        ['video', 'videoupload', self::MODEL_BOTH, 'callback'], // 視頻欄位
    ];

    // ========== 圖片上傳處理 ==========
    protected function upload() {
        $imgNames = $_FILES['image']['name'] ?? [];
        // 過濾空值
        $imgNames = array_filter($imgNames);
        if (empty($imgNames)) return false;

        import('ORG.Net.UploadFile');
        $upload = new UploadFile();
        $upload->saveRule   = 'time';                    // 檔名規則:時間戳
        $upload->allowExts  = ['jpg', 'gif', 'png', 'jpeg', 'webp'];
        $upload->thumb      = true;                      // 啟用縮圖
        $upload->thumbPrefix = '250_115_,150_110_,213_156_'; // 縮圖前綴
        $upload->thumbMaxWidth  = '250,150,213';         // 三種寬度
        $upload->thumbMaxHeight = '115,110,156';         // 三種高度
        $upload->savePath   = './Public/upload/images/'; // 圖片儲存路徑
        $upload->videoPath  = './Public/upload/video/';  // 視頻路徑 (備用)

        if (!$upload->upload()) {
            $this->error = $upload->getErrorMsg();
            return false;
        }

        $this->info = $upload->getUploadFileInfo(); // 取得上傳資訊陣列
        // 回傳第一張圖片的儲存檔名 (供資料庫 image 欄位存儲)
        return $this->info[0]['savename'] ?? false;
    }

    // ========== 視頻上傳處理 ==========
    protected function videoupload() {
        $vidNames = $_FILES['video']['name'] ?? [];
        $vidNames = array_filter($vidNames);
        if (empty($vidNames)) return false;

        // 這裡沿用上方 $this->info (若圖片與視頻同時上傳)
        // 實務建議分開實例化 UploadFile 處理視頻
        return $this->info[0]['savename'] ?? false;
    }
}
?>

控制器動作

<?php
class UploadController extends Controller {
    public function index() {
        $model = D('Upload');
        if ($model->create()) {  // 自動驗證 + 自動完成 (含 upload/videoupload)
            $id = $model->add(); // 寫入資料庫
            if ($id) {
                $this->success('上傳成功', U('index'));
            } else {
                $this->error('資料庫寫入失敗');
            }
        } else {
            $this->error($model->getError());
        }
    }
}
?>

UploadFile 核心參數對照表

多檔案陣列原理解析

表單 name="photo[]" 產生 $_FILES['photo'] 結構:

$_FILES['photo'] = [
    'name'     => ['a.jpg', 'b.png'],
    'type'     => ['image/jpeg', 'image/png'],
    'tmp_name' => ['/tmp/phpX1', '/tmp/phpX2'],
    'error'    => [0, 0],
    'size'     => [12345, 67890],
];

UploadFile::upload() 內部會遍歷此陣列逐一處理,回傳 getUploadFileInfo() 為同結構的資訊陣列。

進階改良建議

  • 分離圖片/視頻處理:各自實例化 UploadFile,設定專屬 allowExts、savePath、thumb。
  • 雲端儲存:上傳成功後以 SDK (OSS、COS、S3) 轉存至雲端,刪除本地暫存檔。
  • 資料庫設計:建立 attachments 表,欄位 type(image/video), path, thumb_paths(JSON), business_id, business_type 實現多態關聯。
  • 前端直傳:大檔案採用「前端直傳雲端 + 後端回調驗證」架構,減輕伺服器頻寬壓力。

結語

ThinkPHP 多檔案上傳核心在於「表單陣列命名」+「模型自動完成回調」+「UploadFile 彈性配置」。掌握此模式,可快速建構支援多圖縮圖、視頻分類、雲端同步的企業級上傳系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
屬性用途常用值
savePath檔案儲存目錄 (需可寫入)./Public/upload/
saveRule檔名命名規則time, uniqid, md5, 自訂函數
allowExts允許副檔名陣列['jpg','png','gif']
thumb是否生成縮圖true/false
thumbPrefix縮圖檔名前綴 (多尺寸用逗號分隔)'200_200_,100_100_'
thumbMaxWidth/Height縮圖最大寬高 (對應 prefix 順序)'200,100'
thumbRemoveOrigin是否刪除原圖false (預設保留)
maxSize單檔最大位元組2097152 (2MB)
hashType檔案雜湊驗證md5, sha1