加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP实现文件下载断点续传分析

发布时间:2022-07-18 14:36:09 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了PHP实现文件下载断点续传详解,本文讲解了载断点续传的实现理解,并给出了实现代码,需要的朋友可以参考下 通常情况下,Web服务器(如Apache)会默认开启对断点续传的支持。因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置
  这篇文章主要介绍了PHP实现文件下载断点续传详解,本文讲解了载断点续传的实现理解,并给出了实现代码,需要的朋友可以参考下
 
  通常情况下,Web服务器(如Apache)会默认开启对断点续传的支持。因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可享受到断点续传的好处。由于这些文件直接通过Web服务器来提供下载,后端脚本无法对这个下载过程进行控制。这对于仅提供公开、静态文件的网站来说不是问题,但对于需要提供私有、动态文件的网站来说,直接通过Web服务器来提供下载就无法满足需求了。这时,就需要在编写后台脚本程序时,加入对断点续传的支持。
 
  本文将以PHP为例,简要介绍实现文件下载断点续传的方法。
 
  原理
 
  断点续传的原理还是比较直观的。
 
 
  实现
 
  由于部分传输不是强制的,服务器可以支持也可以不支持,所以,我们需要在程序中告诉浏览器,它请求的资源是否支持部分传输。这可以通过设置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的取值不合法,则需要终止程序并告知浏览器:
 
  接下来要做的就是把文件的对应部分的内容发送给浏览器。不过要注意的是,这里涉及到需要发送多个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。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读