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

ThinkPHP 3.0 縮略圖無法儲存至子目錄的解決方案

     編輯:PHP 綜合知識

問題背景

ThinkPHP 3.0 `UploadFile` 類預設將縮略圖直接存於 `thumbPath` 根目錄,不支援 `autoSub` 子目錄規則(如按日期、hash 分目錄),導致單一目錄檔案過多、效能下降。

方案一:升級官方修正版(推薦)

下載 ThinkPHP 3.1 版 `UploadFile.class.php` 替換舊檔:
https://github.com/liu21st/extend/tree/master/Extend/Library/ORG/Net

方案二:自行修改核心類(適用無法升級專案)

步驟 1:新增 getThumbSubName() 方法

於 `UploadFile.class.php` 內,模仿既有 `getSubName()` 新增:

private function getThumbSubName($file) {
    switch ($this->subType) {
        case 'date':
            $dir = date($this->dateFormat, time());
            break;
        case 'hash':
        default:
            $name = md5($this->thumbPath);
            $dir = '';
            for ($i = 0; $i < $this->hashLevel; $i++) {
                $dir .= $name{$i} . '/';
            }
            break;
    }
    $full = $this->thumbPath . $dir;
    if (!is_dir($full)) mkdir($full, 0755, true);
    return $dir;
}

步驟 2:修改縮略圖路徑組裝邏輯(約第 158 行)

// 原始
$thumbPath = $this->thumbPath ? $this->thumbPath . ($this->autoSub ? $this->getSubName($file) . '/' : '') : $file['savepath'];

// 修改為
$thumbPath = $this->thumbPath ? $this->thumbPath . ($this->autoSub ? $this->getThumbSubName($file) . '/' : '') : $file['savepath'];

驗證方式

上傳圖片並開啟縮略圖生成,檢查 `thumbPath` 下是否出現 20240115/ 或 a/b/c/ 等子目錄,且縮略圖正確存放其中。

遷移建議

  • ThinkPHP 3.0 已停止維護,新專案建議直接使用 ThinkPHP 6.0+ 或 Laravel,內建更完善的檔案系統抽象層(Flysystem)。
  • 若必須維護舊專案,將此修改封裝為擴充類繼承 `UploadFile`,避免直接修改核心檔案造成升級困難。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved