如果我们的网站提供文件下载的服务,那么通常我们都希望下载可以断点续传(ResumableDownload),也就是说用户可以暂停下载,并在未来的某个时间从暂停处继续下载,而不必重新下载整个文件。
通常情况下,Web服务器(如Apache)会默认开启对断点续传的支持。因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可享受到断点续传的好处。由于这些文件直接通过Web服务器来提供下载,后端脚本无法对这个下载过程进行控制。这对于仅提供公开、静态文件的网站来说不是问题,但对于需要提供私有、动态文件的网站来说,直接通过Web服务器来提供下载就无法满足需求了。这时,就需要在编写后台脚本程序时,加入对断点续传的支持。
本文将以PHP为例,简要介绍实现文件下载断点续传的方法。
原理
断点续传的原理还是比较直观的。
Http协议规定了如何传输某个资源的一部分,而不是全部。比如,有一个文件的大小是字节,浏览器可以只请求该文件的前个字节,或者只请求第到第个字节。通过这种方式,就可以不必在一次请求中传输某个资源的全部内容,而是发起多次请求,每次仅请求其中的一部分内容。等所有这些请求都返回之后,再把得到的内容一块一块的拼接起来得到完整的资源。
实现断点续传就是要利用