如果我们的网站提供文件下载服务,所以我们通常希望可以下载HTTP(resumable下载),这意味着用户可以暂停下载,并在未来的某个时间从暂停下载,无需下载整个文件。

通常情况下,Web服务器(如Apache)将通过HTTP支持默认启用。因此,如果直接通过Web服务器提供下载的文件,你可以不需要特殊的配置,你可以享受到HTTP的好处。由于这些文件直接下载到Web服务器,后台脚本无法控制下载过程。这不是网站只提供开放静态文件的问题。但对于那些需要私有或动态文件的网站,它不能直接通过Web服务器满足需求。此时,您需要在后台脚本中写入,添加到HTTP支持中。

本文以PHP为例,简要介绍了文件下载http的实现方法。

原理

HTTP的原理非常直观。

HTTP协议指定如何传输资源的一部分而不是全部。例如,一个文件的大小是1000字节,而浏览器只能请求文件的前300字节,或只有第五百到第一千个字节。这样,就没有必要在一个请求中发送的所有一个资源的内容,但同时请求多个请求后,返回所有这些请求,得到的碎片拼接在一起,得到完整的资源。

HTTP是HTTP协议的特性。当用户暂停下载时,浏览器将记录下载的位置。当用户的简历下载在某个时间,它可以继续下载从去年暂停的位置而无需从头开始。

实现

由于传输的部分不是强制性的,服务器可以支持或不支持,所以我们需要告诉浏览器所请求的资源是否支持程序中的部分传输:

复制代码代码如下所示:

头('accept-ranges:字节);



接受范围:字节告诉浏览器,这个资源支持字节的部分传输。这个响应头需要连接到支持部分传输的所有资源。

当一个请求被接受的,我们需要从浏览器的请求,请求的资源的哪一部分是专门的浏览器提取。这个信息是通过范围请求头。在PHP中,它是存储在$ _server { 'http_range}。我们需要检查这个变量定义,如果它的定义,使用该值,否则,该范围设置作为一个整体资源。

复制代码代码如下所示:

$范围=0($ content_length-1);

如果(isset($ _server { 'http_range ' })){

美元美元'http_range_server范围= { };

}



接下来,您需要分析$范围的值,以确定返回的资源的哪一部分:

复制代码代码如下所示:

100-200 / /第一百到第二百字节

500 -第五百字节在文件的结尾

1000字节- 1000 /最后



需要注意的是,在获得一个范围后,您需要检查它的值,包括:

1。起始位置非负

2。结束位置需要大于起始位置。

3。开始位置需要减少文件长度的一个(因为这里的位置索引从0开始)

4。如果结束位置大于文件长度减去1,则需要将其值设置为文件长度减去1。

如果范围的值不合法,则需要终止程序并通知浏览器:

复制代码代码如下所示:

头('http / 1.1 416请求范围不满足);



为了使文章简洁,这里没有提供具体的校验码。下面的假设是你检查了范围的值,得到了两个变量,分别是起始和结束位置,分别表示起始位置和结束位置。

下一步要做的是将文件的相应部分的内容发送到浏览器。但是,需要注意的是,需要发送多个HTTP响应头,如下所示:

复制代码代码如下所示:

头('http / 1.1 206部分内容);

头('accept-ranges:字节);

标题(内容范围:字节开始-结束美元美元美元/文件大小);

$长度= $结束- $开始+ 1;

页眉(内容长度:$长度);

输出文件的指定部分



这里的长度需要注意,它的值是传输内容的长度,而不是整个文件的长度。另一点需要注意的是,这里的HTTP状态码是206,而不是200。

总结

HTTP文件下载实际上是用来支持HTTP协议中文件的传输部分,HTTP协议的特性不仅可以用来实现HTTP,客户端程序也可以用它来实现多线程下载。

在HTTP的过程中,需要注意正确设置的各种HTTP头信息。错误的报头信息会导致用户下载的文件损坏,无法使用。