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

PHP 遞迴刪除指定目錄下非圖片檔案完整實例

     編輯:PHP 相關知識

需求背景

專案需定期清理上傳目錄,僅保留特定尺寸的頭像圖片(如 180x180.jpg、30x30.jpg 等),刪除其他雜項檔案。本文提供一個遞迴掃描並依條件刪除的完整函數。

核心程式碼

<?php
/**
 * 遞迴刪除指定目錄下的非法檔案
 * @param string $dir 目標目錄路徑
 */
function my_del($dir) {
    if (is_dir($dir)) {
        // 開啟目錄遞迴處理子項目
        if ($handle = opendir($dir)) {
            while (false !== ($file = readdir($handle))) {
                if ($file !== '.' && $file !== '..') {
                    my_del($dir . '/' . $file); // 遞迴處理
                }
            }
            closedir($handle);
        }
    } else {
        // 檔案層級:保留白名單圖片,其餘刪除
        $allowed = ['180x180.jpg', '30x30.jpg', '45x45.jpg', '90x90.jpg'];
        $filename = basename($dir);
        
        // 1. 檢查副檔名是否為 .jpg
        if (strripos($filename, '.jpg') === false || substr($filename, -4) !== '.jpg') {
            @unlink($dir);
            return;
        }
        
        // 2. 檢查檔名是否在白名單
        if (!in_array($filename, $allowed)) {
            @unlink($dir);
            return;
        }
        
        // 3. 進一步驗證圖片實際內容(防止偽裝副檔名)
        $info = @getimagesize($dir);
        if (!$info || $info[2] !== IMAGETYPE_JPEG) {
            @unlink($dir);
        }
    }
}

// 使用範例
$targetDir = 'D:/xampp/htdocs/www/avatar001/12/47/';
my_del($targetDir);
?>

關鍵邏輯解析

  1. 遞迴遍歷:opendir → readdir → 遞迴呼叫 → closedir 標準模式。
  2. 雙重過濾機制:
    • 檔名白名單:精確比對允許保留的檔名。
    • 內容驗證:使用 getimagesize() 檢查 MIME 類型為 JPEG (常數 IMAGETYPE_JPEG = 2),防止惡意上傳偽裝副檔名的腳本。
  3. 錯誤抑制 @:避免權限不足或檔案不存在時噴出警告,視專案需求決定是否保留。

安全性建議

  • 正式環境建議移除 @ 並記錄錯誤日誌,便於追蹤刪除失敗原因。
  • 白名單應從設定檔或資料庫讀取,避免硬編碼。
  • 執行前先備份目標目錄,或加入 Dry-run 模式(僅列出將刪除檔案不實際刪除)。

擴充應用

可依需求調整保留條件:

  • 保留最近 N 天的檔案:比對 filemtime()。
  • 保留特定尺寸:解析 getimagesize() 回傳的寬高。
  • 轉移而非刪除:改用 rename() 移至隔離區,保留審計軌跡。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved