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

ThinkPHP 檔案上傳完整實戰:多檔、縮圖、類型驗證、資料庫記錄

     編輯:PHP 綜合知識

檔案上傳是專案常見需求。ThinkPHP UploadFile 類提供豐富配置選項,支援多檔、縮圖、類型限制、重命名規則等。本文提供完整實作範例。

Controller:FileAction.class.php

select();
        $this->assign('filelist', $list);
        $this->display();
    }
    
    // 上傳處理
    public function upload() {
        if (empty($_FILES)) {
            $this->error('請選擇上傳檔案');
        }
        
        $uploadInfo = $this->_doUpload();
        if ($uploadInfo) {
            if ($this->_saveToDb($uploadInfo)) {
                $this->success('上傳成功');
            } else {
                $this->error('資料庫寫入失敗');
            }
        } else {
            $this->error('上傳異常');
        }
    }
    
    /** 執行上傳核心邏輯 */
    private function _doUpload() {
        import('@.ORG.UploadFile'); // 需將 UploadFile.class.php 放入 Lib/ORG/
        
        $upload = new UploadFile();
        $upload->maxSize       = 1000000;      // 1MB
        $upload->savePath      = './Public/Upload/'; // 儲存路徑 (建議與入口同級)
        $upload->saveRule      = 'uniqid';     // 唯一檔名規則
        $upload->uploadReplace = true;         // 同名覆蓋
        $upload->allowExts     = ['jpg','jpeg','png','gif']; // 允許副檔名
        $upload->allowTypes    = ['image/png','image/jpg','image/jpeg','image/gif']; // MIME 類型
        
        // 縮圖配置
        $upload->thumb           = true;
        $upload->thumbMaxWidth   = '300,500';  // 多尺寸寬度
        $upload->thumbMaxHeight  = '200,400';  // 多尺寸高度
        $upload->thumbPrefix     = 's_,m_';    // 縮圖前綴
        $upload->thumbRemoveOrigin = true;     // 刪除原圖 (僅保留縮圖)
        
        if ($upload->upload()) {
            return $upload->getUploadFileInfo(); // 回傳上傳資訊陣列
        } else {
            $this->error($upload->getErrorMsg());
            return false;
        }
    }
    
    /** 寫入資料庫 */
    private function _saveToDb($data) {
        $file = M('file');
        $success = 0;
        // $data 最後一元素可能為空,實際筆數為 count-1
        for ($i = 0; $i < count($data) - 1; $i++) {
            $fileData['filename'] = $data[$i]['savename'];
            if ($file->data($fileData)->add()) {
                $success++;
            }
        }
        return $success === count($data) - 1;
    }
}
?>

模板:index.html



    小圖:
中圖:



UploadFile 關鍵配置屬性

屬性說明預設值
maxSize最大檔案大小 (bytes),-1 不限制-1
savePath儲存目錄 (需可寫權限)./Uploads/
saveRule檔名生成規則:uniqid、time、md5、自訂函式名uniqid
allowExts允許副檔名陣列 (不含點)[]
allowTypes允許 MIME 類型陣列 (二次驗證)[]
thumb是否生成縮圖false
thumbMaxWidth/Height縮圖最大尺寸,逗號分隔支援多尺寸''
thumbPrefix縮圖前綴,對應多尺寸'thumb_'
thumbRemoveOrigin生成縮圖後刪除原檔false
uploadReplace同名檔案是否覆蓋false

安全與效能補充

  • MIME 偽造風險:$_FILES['type'] 來自瀏覽器,不可信。建議用 finfo_file() 或 getimagesize() 二次驗證檔案真實類型。
  • 儲存路徑隔離:上傳目錄應**不可直接執行 PHP** (Nginx/Apache 設定 php_flag engine off),防止上傳木馬執行。
  • 大檔案分片:>100MB 檔案建議前端分片上傳 (Plupload、WebUploader),後端合併。
  • 雲端儲存:生產環境建議直接上傳至 OSS/S3,ThinkPHP 僅處理簽名授權與資料庫記錄。

此範例展示了 ThinkPHP 檔案上傳的標準流程,實際專案請根據業務調整驗證規則、儲存策略與錯誤處理。

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