當前位置: 首頁> 最新文章列表> PHP實現超大文件斷點續傳下載的完整教程

PHP實現超大文件斷點續傳下載的完整教程

gitbox 2025-07-15

PHP超大文件下載的挑戰

在開發過程中,遇到大文件下載需求時,使用PHP的readfile()函數雖然簡單,但對於超大文件,直接讀取整個文件輸出會導致內存佔用過高甚至溢出。因此,需要採用更高效的下載方案來保證程序穩定性和用戶體驗。

什麼是斷點續傳下載

斷點續傳允許用戶在下載中斷後,可以從中斷位置繼續下載,無需重複下載已完成的部分。這不僅節省了帶寬,也提升了下載的可靠性和用戶滿意度,尤其在網絡環境不穩定時尤為重要。

斷點續傳的實現步驟

獲取文件路徑和名稱

首先,通過$_GET獲取客戶端傳入的文件路徑參數,並利用basename()函數提取文件名,避免目錄穿越等安全風險。

 $file = $_GET['file'];
$filename = basename($file);

設置HTTP響應頭支持斷點續傳

通過設置Content-Typeapplication/octet-stream ,告訴瀏覽器這是一個二進製文件流。同時設置Content-Disposition頭,指明附件下載和文件名。

根據請求頭中的HTTP_RANGE ,解析出下載起始位置,並使用fseek()調整文件指針,實現斷點續傳。

 header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
if (isset($_SERVER['HTTP_RANGE'])) {
    $range = $_SERVER['HTTP_RANGE'];
    preg_match('/bytes=(\d+)-/', $range, $matches);
    $start = intval($matches[1]);
    fseek($file, $start);
}

循環讀取文件並輸出數據

通過循環讀取文件內容,每次讀取一定大小的緩衝區(例如4096字節),逐步輸出給瀏覽器,並刷新輸出緩衝,保證數據及時傳輸。

 $buffer_size = 4096;
while (!feof($file)) {
    echo fread($file, $buffer_size);
    ob_flush();
    flush();
}

總結

通過上述方法,PHP可以高效支持超大文件的斷點續傳下載,解決了傳統readfile()函數在大文件處理上的不足。開發者還可以基於此實現下載進度顯示、限速控制等功能,進一步提升用戶體驗。

合理利用HTTP協議的Range頭和PHP文件操作函數,可以讓下載服務更加穩定與靈活,適合各種實際業務場景。