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

PHP 檔案瀏覽器實作:虛擬目錄掛載、Base64 路徑編碼、檔案下載

     編輯:PHP 綜合知識

單一檔案檔案管理系統

透過 index.php?path=Base64編碼路徑 實現目錄瀏覽與檔案下載,支援虛擬掛載任意實體目錄(預設 F:)。

核心功能

  • Base64 URL-safe 編碼:base64url_encode()/base64url_decode() 防止路徑注入
  • 路徑安全檢查:正則過濾 ..、./、雙斜線等危險模式
  • 目錄列表:顯示檔名、大小(自動單位 B/K/M/G)、連結進入子目錄或下載檔案
  • 父目錄導航:自動解析上層路徑
  • 檔案下載:Content-Disposition: attachment、支援 Accept-Ranges 斷點續傳

關鍵程式碼

$dir = "F:"; // 掛載根目錄
$path = "";
if (isset($_GET["path"])) {
    $path = base64url_decode($_GET["path"]);
    // 安全檢查
    if (preg_match("#^[^/].*$|^.*\.$|^\..*$|\./\.|/\.|\./#", $path)) exit("非法路徑");
    $path = preg_replace("#[/\/]{2,}#", "/", $path);
}

if (is_dir($dir . $path)) {
    // 輸出目錄列表 HTML
    $dh = opendir($dir . $path);
    while ($filen = readdir($dh)) {
        if ($filen == '.' || $filen == '..') continue;
        $full = $dir . $path . '/' . $filen;
        $enc = base64url_encode($path . '/' . $filen);
        if (is_file($full)) {
            echo "<a href='index.php?path=$enc'>$filen</a> (" . format_file_size(filesize($full)) . ")<br/>";
        } else {
            echo "<a href='index.php?path=$enc'>$filen</a><br/>";
        }
    }
    // 父目錄連結
    if ($path !== '') {
        preg_match("#([^/]+/{1})*[^/]+(?=/)#", $path, $parent);
        $parentPath = $parent ? '/'.$parent[0] : '/';
        echo "<a href='index.php?path=" . base64url_encode($parentPath) . "'>..</a><br/>";
    }
} elseif (is_file($dir . $path)) {
    // 檔案下載
    header("Content-type: application/octet-stream");
    header("Accept-Ranges: bytes");
    header("Content-Length: " . filesize($dir.$path));
    header("Content-Disposition: attachment; filename=" . basename($dir.$path));
    readfile($dir.$path);
}

部署建議

  • 將 $dir 設為網站根目錄外的儲存區,避免洩露原始碼
  • 生產環境建議加入身分驗證與存取日誌
  • 大檔案下載改用 X-Sendfile 或 X-Accel-Redirect 交給 Web Server 處理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved