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

PHP 採集圖片並按原路徑結構本地化保存

     編輯:PHP 相關知識

PHP 採集圖片並按原路徑結構本地化保存

採集遠程圖片時,為保持引用路徑一致性,常需按原 URL 路徑結構在本地重建目錄並保存。下面提供一個精簡的 PHP 腳本實現此功能,自動創建多級目錄、下載圖片、生成預覽標籤。

核心代碼

';

/**
 * 遞歸創建多級目錄
 * @param string $pathname 目標路徑
 * @param int    $mode     權限
 * @return bool
 */
function mkdirs($pathname, $mode = 0755) {
    if (is_dir($pathname)) return true;
    mkdirs(dirname($pathname), $mode);
    return @mkdir($pathname, $mode);
}

關鍵點解析

函數/技巧作用
pathinfo()解析 URL 路徑,提取 dirname、basename、extension
遞歸 mkdirs()解決 mkdir() 不支持多級創建的問題 (PHP 5+ mkdir($path, 0777, true) 已原生支持)
index.htm防止 Web 服務器開啟目錄列表洩露文件結構
file_get_contents/put_contents簡單場景下替代 cURL,無需額外依賴

增強版:支持批量採集、異常處理、cURL 下載

function fetchImages(array $urls, $domain, $saveRoot = '.') {
    $results = [];
    foreach ($urls as $url) {
        try {
            $pathInfo = pathinfo($url);
            $saveDir = $saveRoot . $pathInfo['dirname'] . '/';
            
            if (!is_dir($saveDir)) {
                mkdir($saveDir, 0777, true);
                @file_put_contents($saveDir . 'index.html', '');
            }
            
            $ch = curl_init($domain . $url);
            curl_setopt_array($ch, [
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_TIMEOUT        => 30,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_USERAGENT      => 'Mozilla/5.0 Image Collector',
            ]);
            $data = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
            
            if ($httpCode !== 200 || !$data) {
                throw new Exception("HTTP $httpCode");
            }
            
            $savePath = $saveRoot . $url;
            file_put_contents($savePath, $data);
            $results[$url] = ['status' => 'ok', 'path' => $savePath];
        } catch (Throwable $e) {
            $results[$url] = ['status' => 'fail', 'error' => $e->getMessage()];
        }
    }
    return $results;
}

應用場景

  • 站點鏡像/靜態化部署前圖片本地化
  • 內容遷移時保持相對路徑不變
  • 圖片防盜鏈繞過:服務端代理下載後本地化服務

注意事項

  1. 大規模採集請使用隊列 (Redis/RabbitMQ) + 多進程消費,避免超時與內存溢出。
  2. 遵守 robots.txt 與版權協議,僅作合法用途。
  3. 生產環境建議驗證 Content-Type、文件大小、圖片合法性 (getimagesize) 後再保存。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved