斷點續傳的基礎在於將大檔案切割為固定大小的區塊,上傳時逐塊傳輸,中斷後可從失敗處繼續;下載端則需合併區塊還原完整檔案。本文提供純 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 位元組數) |
Content-Range 標頭分片上傳