<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head><meta forua="true" http-equiv="Cache-Control" content="max-age=0" /></head>
<card title="详解PHP实现文件下载断点续传（附代码）" id="card1">
<p> 游客</p><p>
标题:详解PHP实现文件下载断点续传（附代码）<br/>
正文:<br/>
如果我们的网站提供文件下载的服务，那么通常我们都希望下载可以断点续传(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 = &amp;quot;0-<br/><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1877&amp;Page=1">[&lt;&lt;]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1877&amp;Page=1">[[1]]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1877&amp;Page=2">[2]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1877&amp;Page=3">[3]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1877&amp;Page=3">[&gt;&gt;]</a><br/>
<br/>
<a href="wap.asp?act=Com&amp;id=1877">查看评论(0)</a><br/>
<a href="wap.asp?act=AddCom&amp;inpId=1877">发表评论</a><br/><br/>

<br/>

<br/>
<a href="http://camnpr.com/wap.asp">首页</a>
</p>
</card>
</wml>