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

自製 PHP 檔案上傳類別:功能完整、易於擴充

     編輯:PHP 相關知識

前言

在 PHP 專案中處理檔案上傳是常見需求。雖然網路上有許多現成函式庫,但自己撰寫一個輕量級的上傳類別,不僅能精準掌握每個細節,還能依專案需求彈性擴充。本文將帶您逐步建構一個功能完整的 ieb_upload 類別,涵蓋檔案驗證、隨機重命名、縮圖產生、路徑管理等核心功能。

類別架構與屬性設計

首先定義類別所需的屬性,分別對應表單欄位名稱、儲存目錄、大小限制、上傳狀態旗標、錯誤代碼、最終檔名與縮圖檔名:

class ieb_upload {
    var $FormName;   // 表單 file 欄位名稱
    var $Directroy;  // 上傳目標目錄
    var $MaxSize;    // 允許最大位元組數
    var $CanUpload;  // 是否通過初步檢查
    var $doUpFile;   // 最終儲存的檔案名稱
    var $sm_File;    // 縮圖檔案名稱
    var $Error;      // 錯誤代碼
    // ...
}

建構子:參數初始化與基本防呆

建構子接受三個參數(表單名稱、目錄路徑、大小上限),並執行基本驗證:

  • 若表單名稱為空,直接標記不可上傳並設定錯誤碼 1。
  • 目錄路徑若不為空,自動補上斜線,確保路徑格式一致。
  • 預設大小上限為 2 MB(2097152 bytes)。
function ieb_upload($formName='', $dirPath='', $maxSize=2097152) {
    global $FormName, $Directroy, $MaxSize, $CanUpload, $Error, $doUpFile, $sm_File;
    $FormName = $formName;
    $MaxSize  = $maxSize;
    $CanUpload = true;
    $doUpFile = '';
    $sm_File  = '';
    $Error    = 0;

    if ($formName == '') {
        $CanUpload = false;
        $Error = 1;
        return;
    }
    $Directroy = ($dirPath == '') ? $dirPath : $dirPath . '/';
}

核心功能方法

1. 檔案存在性檢查 scanFile()

使用 is_readable() 確認暫存檔是否可讀,若不可讀則設定錯誤碼 2。

2. 取得檔案大小 getSize($format='B')

支援 B、KB、MB 三種單位回傳,若檔案大小為 0 則設定錯誤碼 3 並禁止上傳。

3. 取得副檔名 / MIME 類型

透過 pathinfo() 或 $_FILES['type'] 取得,配合白名單機制過濾危險副檔名(如 .php、.exe)。

4. 隨機重命名

採用 date('YmdHis') . rand(1000,9999) 產生唯一檔名,避免衝突與資安風險。

5. 圖片縮圖產生

利用 GD 函式庫 imagecreatetruecolor()、imagecopyresampled() 等函式,依指定寬高等比例縮放,並輸出為 JPEG/PNG 格式。

使用範例

$upload = new ieb_upload('myFile', 'uploads/', 5*1024*1024); // 5 MB
if ($upload->CanUpload) {
    $upload->scanFile();
    if ($upload->CanUpload) {
        $newName = $upload->doUpload(); // 執行實際移動與縮圖
        echo "上傳成功:{$upload->doUpFile}";
        if ($upload->sm_File) echo ",縮圖:{$upload->sm_File}";
    } else {
        echo "錯誤代碼:{$upload->Error}";
    }
}

安全性建議

  1. 嚴格限制允許上傳的 MIME 類型與副檔名白名單。
  2. 上傳目錄設定為不可執行腳本(Nginx/Apache 關閉 PHP 解析)。
  3. 檔案儲存後以隨機檔名存取,避免直接 URL 猜測。
  4. 搭配 open_basedir 限制 PHP 讀寫範圍。

結語

這個 ieb_upload 類別雖然精簡,卻涵蓋了實務上最常見的上傳需求。您可以依專案繼續擴充:支援多檔案、雲端儲存(S3/OSS)、斷點續傳、病毒掃描整合等。自行撰寫核心元件,不僅能深入理解 PHP 檔案處理機制,也能在未來維護時更得心應手。

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