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

PHP 獲取遠程文件大小:HEAD 請求 + Content-Length 解析

     編輯:PHP 綜合知識

不下載檔案內容,僅發送 HTTP HEAD 請求解析 Content-Length 標頭,快速獲取遠程檔案大小。適用於下載前檢查、連結預覽、資源驗證。

核心函數

function get_remote_filesize($url) {
    if (empty($url)) return false;

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_HEADER => true,     // 返回頭部
        CURLOPT_NOBODY => true,     // HEAD 請求,不返回體
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true, // 跟隨重定向
        CURLOPT_TIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => false, // 僅測試用,生產請驗證
        CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; PHP Filesize Bot)',
    ]);

    $head = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode !== 200) return false;

    // 解析 Content-Length
    if (preg_match('/Content-Length:\s*(\d+)/i', $head, $m)) {
        return (int)$m[1];
    }
    return false;
}

// 使用
$size = get_remote_filesize('https://example.com/video.mp4');
if ($size !== false) {
    echo '大小: ' . number_format($size) . ' 位元組 (' . round($size/1024/1024, 2) . ' MB)';
} else {
    echo '無法獲取大小(可能不支援 HEAD、需驗證、或重定向循環)';
}

關鍵 cURL 選項說明

選項值作用
CURLOPT_NOBODYtrue發送 HEAD 請求,不下載 body
CURLOPT_HEADERtrue將回應頭包含在返回字符串中
CURLOPT_FOLLOWLOCATIONtrue自動跟隨 301/302 重定向
CURLOPT_MAXREDIRS5限制重定向次數防循環
CURLOPT_TIMEOUT10總超時秒數
CURLOPT_CONNECTTIMEOUT5連線階段超時

替代方案:get_headers()(無 cURL 依賴)

function get_remote_filesize_native($url) {
    $headers = @get_headers($url, 1);
    if (!$headers) return false;
    $cl = $headers['Content-Length'] ?? $headers['content-length'] ?? null;
    return $cl ? (int)$cl : false;
}

缺點:不支援重定向跟隨控制、超時控制較弱、部分主機禁用 allow_url_fopen。

常見失敗原因與對策

進階:支援 Range 請求的大小獲取

function get_remote_filesize_range($url) {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_HEADER => true,
        CURLOPT_NOBODY => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => ['Range: bytes=0-0'], // 請求第一字節
    ]);
    $head = curl_exec($ch);
    curl_close($ch);
    // 解析 Content-Range: bytes 0-0/12345678
    if (preg_match('/Content-Range:\s*bytes\s+\d+-\d+\/(\d+)/i', $head, $m)) {
        return (int)$m[1];
    }
    // 回退 Content-Length
    if (preg_match('/Content-Length:\s*(\d+)/i', $head, $m)) {
        return (int)$m[1];
    }
    return false;
}

某些 CDN/對象儲存不回傳 Content-Length 但支援 Content-Range,此法可作補充。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
原因現象對策
伺服器不支援 HEAD返回 405/501 或無 Content-Length改用 GET + Range: bytes=0-0 讀取 1 字節推測
動態生成內容無 Content-Length,用 Transfer-Encoding: chunked無法預知大小,需下載完才知
需登入/簽名401/403帶上 Cookie/Authorization header
防盜鏈 Referer 檢查403設定 CURLOPT_REFERER
HTTPS 證書驗證失敗cURL error 60設定 CURLOPT_CAINFO 或開發環境關閉驗證