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

ThinkPHP 3.2 UploadFile 類完整上傳指南:圖片縮略圖、驗證、多文件與安全配置

     編輯:PHP 相關知識

前置條件:表單必須設置 enctype


<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="photo" id="photo">
    <input type="submit" value="上傳">
</form>

缺少 enctype="multipart/form-data" 將導致 $_FILES 為空。

核心上傳代碼


import('ORG.Net.UploadFile');
$upload = new UploadFile();

// 基礎配置
$upload->maxSize    = 3 * 1024 * 1024;     // 3MB
$upload->allowExts  = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
$upload->allowTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; // MIME 驗證
$upload->savePath   = './Public/Uploads/';  // 絕對路徑更安全
$upload->saveRule   = 'uniqid';             // 唯一文件名:uniqid + 微秒
$upload->hashType   = 'md5_file';           // 可選:按內容哈希去重

// 縮略圖配置(僅圖片有效)
$upload->thumb          = true;
$upload->thumbPrefix    = 'thumb_';         // 前綴
$upload->thumbMaxWidth  = 300;
$upload->thumbMaxHeight = 300;
$upload->thumbRemoveOrigin = false;         // true 刪除原圖,僅保留縮略圖
$upload->thumbPath      = './Public/Uploads/Thumb/'; // 縮略圖單獨目錄

// 多文件上傳(表單 name="photos[]")
// $upload->autoSub = true; // 按日期自動建子目錄:20240115/

// 執行上傳
if (!$upload->upload()) {
    $this->error($upload->getErrorMsg()); // 如:非法文件類型、超過大小、寫入失敗
} else {
    $info = $upload->getUploadFileInfo();
    // $info = [
    //   ['name'=>'photo', 'savename'=>'5a1b2c3d.jpg', 'size'=>12345, 'type'=>'image/jpeg', ...],
    //   ...
    // ]
    $this->success('上傳成功', '', $info);
}

關鍵屬性詳解

屬性類型說明建議值
maxSizeint最大字節數,0 不限制2M-10M
allowExtsarray允許副檔名(不含點)['jpg','png','pdf']
allowTypesarray允許 MIME 類型(雙重驗證)['image/jpeg','application/pdf']
saveRulestring命名規則:uniqid / time / hash / 自定義函數名'uniqid'
autoSubbool自動按日期建子目錄true
subTypestring子目錄格式:date / custom'date'
thumbbool生成縮略圖true
thumbMaxWidth/Heightint縮略圖最大寬高(等比縮放)300/300
thumbRemoveOriginbool刪除原圖false
zipImagesbool上傳後自動壓縮圖片品質false

安全加固清單

  1. 目錄執行權限:上傳目錄 禁止 PHP 執行權限(Nginx: location ~* \.php$ { deny all; },Apache: php_flag engine off)。
  2. MIME 類型二次驗證:finfo_file 或 getimagesize() 驗證真實文件類型,防止偽造副檔名。
  3. 文件名安全:永不使用原始文件名,強制 uniqid/hash 重命名。
  4. 大小限制雙重保障:PHP upload_max_filesize/post_max_size + 代碼 maxSize。
  5. 防止遍歷下載:下載接口使用資料庫 ID 映射真實路徑,不直接暴露文件路徑。

多文件上傳處理


// 表單:
// 控制器
$upload->autoSub = true;
if ($upload->upload()) {
    $files = $upload->getUploadFileInfo();
    foreach ($files as $file) {
        // 入庫記錄
        M('Attachment')->add([
            'module'   => 'Article',
            'filename' => $file['name'],
            'savename' => $file['savename'],
            'savepath' => $file['savepath'],
            'size'     => $file['size'],
            'ext'      => $file['extension'],
            'create_time' => time(),
        ]);
    }
}

結語

ThinkPHP UploadFile 類功能完善,掌握 saveRule、thumb、autoSub、allowTypes 等核心屬性,配合目錄執行權限禁用、MIME 二次驗證、重命名存儲,即可構建安全可靠的文件上傳系統。ThinkPHP 5/6 請遷移至 think\File / think\facade\Filesystem 新組件。

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