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

PHP 斷點續傳核心技術:大檔案分割與合併實作

     編輯:PHP 相關知識

斷點續傳的基礎在於將大檔案切割為固定大小的區塊,上傳時逐塊傳輸,中斷後可從失敗處繼續;下載端則需合併區塊還原完整檔案。本文提供純 PHP 實作的分割與合併核心邏輯。

分割檔案

<?php
ini_set("memory_limit", "50M");
ini_set("max_execution_time", "100");

$orgFile = 'Fireworks8-chs.exe';
$cacheFileName = 'vbcache';

function cutFile($fileName, $block) {
    global $cacheFileName;
    if (!file_exists($fileName)) return false;
    
    $num = 1;
    $file = fopen($fileName, 'rb');
    while ($content = fread($file, $block)) {
        $cacheFile = $cacheFileName . $num++ . '.dat';
        $cfile = fopen($cacheFile, 'wb');
        fwrite($cfile, $content);
        fclose($cfile);
    }
    fclose($file);
}

function mergeFile($targetFile) {
    global $cacheFileName;
    $num = 1;
    $file = fopen($targetFile, 'wb');
    while ($num > 0) {
        $cacheFile = $cacheFileName . $num++ . '.dat';
        if (file_exists($cacheFile)) {
            $cfile = fopen($cacheFile, 'rb');
            $content = fread($cfile, filesize($cacheFile));
            fclose($cfile);
            fwrite($file, $content);
        } else {
            $num = -1;  // 結束迴圈
        }
    }
    fclose($file);
}

// 執行:分割為 10MB 區塊,再合併
cutFile($orgFile, 10 * pow(2, 20));  // 10 * 2^20 = 10MB
mergeFile('ok.exe');
?>

關鍵函數解析

函數用途
fopen(..., 'rb')二進位唯讀模式開啟,避免 Windows 換行符轉換
fread($fp, $length)讀取指定位元組數,適合二進位檔案
fwrite($fp, $data)寫入二進位資料
filesize()取得檔案大小(結果會快取,需搭配 clearstatcache())
pow(2,20)計算 2^20 = 1,048,576(1MB 位元組數)

生產環境擴展方向

  1. 上傳端:前端用 Blob.slice() 切片,配合 Content-Range 標頭分片上傳
  2. 伺服端:建立上傳會話記錄已收到分片索引,支援斷點續傳
  3. 完整性驗證:各分片與完整檔案計算 MD5/SHA256 校驗和
  4. 併發控制:限制同時上傳分片數,避免記憶體耗盡
  5. 暫存清理:設定過期機制清理未完成的分片檔案
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved