当前位置:首页 > 建站教程 > 正文

PHP实现文件下载中断点续传详解

时间:2019-10-05 18:18编辑:爱哭的毛毛虫

核心提示 假如我们的网站提供文件下载的服务,那么通常我们都但愿下载可以中断点续传(Resumable Download),也就是说用户可以暂停...

假如我们的网站提供文件下载的服务,那么通常我们都但愿下载可以中断点续传(Resumable Download),也就是说用户可以暂停下载,并在未来的某个时间从暂停处继承下载,而不必重新下载整个文件。

通常情况下,Web服务器(如 Apache )会默认开启对中断点续传的支持。因此,假如直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可享受到中断点续传的好处。因为这些文件直接通过Web服务器来提供下载,后端脚本无法对这个下载过程入行控制。这对于仅提供公然、静态文件的网站来说不是题目,但对于需要提供私有、动态文件的网站来说,直接通过Web服务器来提供下载就无法知足需求了。这时,就需要在编写后台脚本程序时,加进对中断点续传的支持。

本文将以PHP为例,扼要先容实现文件下载中断点续传的方法。

原理

中断点续传的原理仍是比较直观的。

Http 协议划定了如何传输某个资源的一部门,而不是全部。好比,有一个文件的大小是1000字节,浏览器可以只哀求该文件的前300个字节,或者只哀求第500到第1000个字节。通过这种方式,就可以不必在一次哀求中传输某个资源的全部内收留,而是发起多次哀求,每次仅哀求其中的一部门内收留。等所有这些哀求都返归之后,再把得到的内收留一块一块的拼接起来得到完整的资源。

实现中断点续传就是要利用 http协议 的上述特性。当用户暂停下载的时候,浏览器会记实已经下载到什么位置,当用户在未来某一时间恢复下载时,就可以从上次暂停的位置继承下载,而不必从头开始。

实现

因为部门传输不是强制的,服务器可以支持也可以不支持,所以,我们需要在程序中告诉浏览器,它哀求的资源是否支持部门传输。这可以通过设置HTTP的 Accept-Ranges 响应头信息来实现。PHP代码如下:

代码如下:

header('Accept-Ranges: bytes');

Accept-Ranges: bytes 告诉浏览器,该资源支持以字节为单位的部门传输。这个响应头需要附加在支持部门传输的所有资源上。

当接受到一个哀求时,我们需要从浏览器的哀求中提取浏览器详细是在哀求资源的哪一个部门。这个信息是通过 Range 哀求头来传递的。在PHP中,它被存储在$_SERVER['HTTP_RANGE']中。我们需要检查这个变量是否定义了,假如定义了,则使用该值,否则,就将range设为整个资源。

代码如下:

$range = "0-". ($content_length-1);

if(isset($_SERVER['HTTP_RANGE'])){

$range = $_SERVER['HTTP_RANGE'];

}

接下来,就需要分析 $range 的值,来决定返归资源的哪一部门内收留。可能的取值示例:

代码如下:

100-200 // 第100到第200字节

500-    // 第500字节到文件末尾

-1000   // 最后的1000个字节

这里需要留意,得到一个Range之后,你需要对它的取值入行检修,包括:

1.开始位置非负

2.结束位置需要大于开始位置

3.开始位置需要小于文件长度减一 (由于这里的位置索引是从0开始的)

4.若结束位置大于文件长度减一,则需要把它的值设置为文件长度减一

假如Range的取值不正当,则需要终止程序并告知浏览器:

代码如下:

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

为了保持文章简洁,详细的校验代码这里就不提供了。下面假定你已经校验了Range的取值,并得到了 $start 和 $end 两个变量,分别表示开始位置和结束位置。

接下来要做的就是把文件的对应部门的内收留发送给浏览器。不外要留意的是,这里涉及到需要发送多个HTTP响应头信息,详细如下:

代码如下:

header('HTTP/1.1 206 Partial Content');

header('Accept-Ranges: bytes');

header("Content-Range: bytes $start-$end/$filesize");

$length = $end - $start + 1;

header("Content-Length: $length");

/* 输出文件的指定部门 */

这里的$length需要留意一下,它的取值是本次传输的内收留的长度,而不是整个文件的长度。另外需要留意的一点是,这里的HTTP状态码是206,不是200。

总结

文件下载的中断点续传实际上是利用了HTTP协议中对传输部门文件的支持。而HTTP协议的这一特性不仅可以用于实现中断点续传,客户端程序也可以利用它来实现多线程下载。

在实现中断点续传的过程中,需要留意准确设置各种HTTP头信息。错误的头信息将导致用户下载到的文件损坏,bt网页游戏,无法使用。

来源:网络整理


免责声明:本站所有信息均来源于互联网搜集,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻删除。

QQ交流群21989888    广告投放

Copyright © 2015-2019 乐吧网 版权所有  备案号:苏ICP备18009222号