PHP实现文件下载断点续传的核心原理与代码示例

周予安
周予安
发布时间:2026-10-15| 3人浏览过
原创

在Web开发中,如果需要通过后端脚本控制文件的分发(如私有资源或动态生成的内容),直接使用Web服务器可能会丧失控制权。本文介绍如何在PHP中利用HTTP协议的`Accept-Ranges`和`Range`请求头特性,手动处理字节流传输,从而支持用户暂停后从断点继续下载。

为什么需要程序级断点续传

大多数现代Web服务器(如Apache、Nginx)默认支持基于文件的静态资源断点续传。当用户直接访问这些文件时,浏览器会自动发起多次部分请求,服务器返回不同字节段,最终拼接成完整文件。

然而,这种方式存在局限性:
1. 无法控制权限:所有通过Web路径直接暴露的文件均公开可读。
2. 无法动态生成:对于数据库提取、加密或临时生成的文件,必须经由后端脚本输出,此时Web服务器的原生加速失效,需由PHP重新实现该逻辑。

核心实现原理

断点续传的本质是遵循HTTP协议对“部分资源”的定义。其交互流程如下:

  1. 告知支持情况:服务器在响应中声明接受按字节范围请求。
  2. 接收客户端指针:浏览器记录上次下载的偏移量,并通过请求头`Range`告知服务器从何处开始读取。
  3. 发送部分内容:服务器读取对应字节,并返回`206 Partial Content`状态码及相关Header。

第1步:声明支持字节范围

首先,需要让浏览器知道该接口支持断点续传。在输出任何数据前,设置`Accept-Ranges`头部:

header('Accept-Ranges: bytes');

第2步:解析请求的字节范围

浏览器会通过 `$_SERVER['HTTP_RANGE']` 传递具体的请求区间。若该变量为空,则视为正常的全量下载;若存在,则需对其进行解析和校验。

$range = "0-" . ($content_length - 1);
if (isset($_SERVER['HTTP_RANGE'])) {
    $range = $_SERVER['HTTP_RANGE'];
}

常见的 Range 格式说明:

  • 100-200:请求从第100字节到第200字节的数据。
  • 500-:请求从第500字节到文件末尾的数据。
  • -1000:请求文件的最后1000个字节。

第3步:校验 Range 合法性

出于安全和稳定考虑,必须验证请求区间的有效性。若不合法(如越界、逻辑错误),应立即终止并反馈错误:

header('HTTP/1.1 416 Requested Range Not Satisfiable');
exit();

校验规则包括:

  • 起始位置必须非负。
  • 结束位置必须大于起始位置。
  • 起始位置不能超过文件大小减一(索引从0开始)。
  • 若请求的结束位置超出文件实际长度,应将其修正为 filesize - 1。

第4步:配置响应头并输出文件片段

确认范围无误后,需设置一系列关键的HTTP响应头,并输出指定字节的内容。请注意区分 Content-Length(本次传输的大小)与整个文件的大小。

// 设定 206 状态码
header('HTTP/1.1 206 Partial Content');
// 再次声明支持范围
header('Accept-Ranges: bytes');
// 声明本次响应的字节区间:bytes 起始-结束/总大小
header("Content-Range: bytes $start-$end/$filesize");
// 本次输出的字节长度
$length = $end - $start + 1;
header("Content-Length: $length");

/* 此处添加代码将文件从 $start 读取 $length 长度的字节发送至浏览器 */
// 例如使用 fopen 配合 fread 循环输出

注意事项

1. 二进制安全:确保在输出文件内容前没有调用过 `echo` 或其他产生输出的函数,否则会导致 Header 设置失败,引发文件损坏或无法下载。 2. 权限与缓存:涉及私有文件时,务必配合 `Cache-Control: no-cache` 防止代理服务器缓存敏感数据。

以上就是PHP实现文件下载断点续传的详细内容,更多关于PHP文件下载技巧的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。