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

PHP 掃描本地圖片目錄生成 XML 輸出:相簿、圖庫資料源實作

     編輯:PHP 綜合知識

應用場景

  • 前端 Flash/AIR/Flex 相簿組件讀取 XML 資料源。
  • JavaScript 圖庫(如 Justified Gallery、PhotoSwipe)動態載入圖片清單。
  • 多裝置同步:一台裝置拍照上傳,另一台即時顯示(配合 WebSocket/長輪詢)。

核心實作

<?php
header('Content-Type: application/xml; charset=UTF-8');

$dir = __DIR__ . '/uploads/'; // 圖片實體目錄(建議放在 Web 根目錄外,配合 rewrite 存取)
$allowedExt = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp'];
$baseUrl = 'https://' . $_SERVER['HTTP_HOST'] . '/uploads/'; // 公開存取 URL 前綴

$xml = new XMLWriter();
$xml->openMemory();
$xml->setIndent(true);
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('photos');

$dh = opendir($dir);
while (($file = readdir($dh)) !== false) {
    if ($file === '.' || $file === '..') continue;
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
    if (!in_array($ext, $allowedExt, true)) continue;

    $fullPath = $dir . $file;
    if (!is_file($fullPath) || !is_readable($fullPath)) continue;

    $stat = stat($fullPath);
    $xml->startElement('item');
    $xml->writeElement('url', $baseUrl . rawurlencode($file));
    $xml->writeElement('filename', $file);
    $xml->writeElement('size', $stat['size']);
    $xml->writeElement('mtime', date('c', $stat['mtime'])); // ISO 8601
    $xml->writeElement('width', 0); // 可選:getimagesize() 取得,大量檔案會慢
    $xml->writeElement('height', 0);
    $xml->endElement(); // item
}
closedir($dh);

$xml->endElement(); // photos
$xml->endDocument();
echo $xml->outputMemory();

關鍵優化點

  1. 使用 XMLWriter:記憶體效率高、自動處理實體編碼、輸出格式整齊。
  2. 副檔名白名單:避免輸出 .htaccess、.gitignore、Thumbs.db 等雜項。
  3. rawurlencode():檔名含中文、空格、特殊符號時確保 URL 有效。
  4. 快取機制:目錄檔案變動不頻繁時,將 XML 寫入靜態檔或 Redis 快取,減少 I/O。
  5. 分頁/懶載:大量圖片(>500 張)建議加入 ?page=1&limit=50 參數分批輸出。

進階:搭配資料庫管理

若需標籤、相簿分類、權限控制,建議資料庫存儲圖片元資料(路徑、標題、標籤、上傳者、建立時間),XML/JSON API 僅查詢資料庫生成,不再掃描檔案系統。

安全提醒

  • 圖片目錄勿開啟 Options Indexes(防止目錄列表洩露)。
  • 上傳驗證:MIME 檢查、getimagesize() 確認為真實圖片、重新命名(UUID + 副檔名)、移除 EXIF 敏感資訊。
  • 公開存取路徑與實體儲存路徑分離,使用 X-Sendfile / X-Accel-Redirect (Nginx) 或 PHP 讀檔輸出做權限控管。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved