实现支持断点续传的php文件下载,核心在于正确解析客户端发送的 range 请求头,并设置对应的http响应状态码为 206 partial content。具体做法是读取 $_server['http_range'],计算起始字节和结束字节,使用 fseek() 定位文件指针,并通过循环 fread() 分块输出数据。同时必须设置 accept-ranges: bytes、content-range 以及正确的 content-length 头部信息,以确保浏览器或下载工具能够识别并恢复中断的传输。

如何解析Range头并计算字节范围
当客户端发起带 Range 头的请求时,服务器需要提取具体的字节区间。例如 Range: bytes=0-1023 表示请求前1024个字节。如果只指定起始位置如 Range: bytes=500-,则默认请求从第500字节到文件末尾。解析逻辑需处理多种格式,包括单个范围、多个范围(通常服务端只返回第一个)以及非法格式。计算出 $start 和 $end 后,若 $end 超出文件大小,则将其修正为文件大小减一。
<?php function parseRange($rangeHeader, $fileSize) {
if (empty($rangeHeader)) {
return ['start' => 0, 'end' => $fileSize - 1];
}
// 简单示例:处理 bytes=start-end
preg_match('/bytes=(\d+)-(\d*)/', $rangeHeader, $matches);
if (!isset($matches[1])) {
return null; // 无效格式
}
$start = intval($matches[1]);
$end = isset($matches[2]) && $matches[2] !== '' ? intval($matches[2]) : $fileSize - 1;
if ($end >= $fileSize) {
$end = $fileSize - 1;
}
if ($start > $end || $start >= $fileSize) {
return null; // 范围无效
}
return ['start' => $start, 'end' => $end];
}
// 假设 $fileSize 已获取
// $range = parseRange($_SERVER['HTTP_RANGE'], $fileSize);



















