加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP支撑断点续传实例代码

发布时间:2023-06-09 13:05:56 所属栏目:PHP教程 来源:
导读:让PHP下载代码支持断点续传,主要靠的 HTTP协议中header Content-Range来实现.对于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可,代码如下:GET /Path/FileName HTTP/1.0 Host: www.server.com:80Accep

让PHP下载代码支持断点续传,主要靠的 HTTP协议中header Content-Range来实现.

对于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可,代码如下:

GET /Path/FileName HTTP/1.0 

Host: www.server.com:80

Accept: **表示接收任何类型的数据。User-Agent表示用户代理,这个字段可有可无,但强烈建议加上,因为它是服务器统计、追踪以及识别客户端的依据。Connection字段中的close表示使用非持久连接。

关于HTTP协议更多的细节可以参考RFC2616(HTTP 1.1),因为我只是想通过HTTP协议实现文件下载,所以也只看了一部分,并没有看全。

如果服务器成功收到该请求,并且没有出现任何错误,则会返回类似下面的数据:

HTTP/1.0 200 OK  

Content-Length: 13057672  

Content-Type: application/octet-stream  

Last-Modified: Wed, 10 Oct 2005 00:56:34 GMT  

Accept-Ranges: bytes  

ETag: "2f38a6cac7cec51:160c"  

Server: Microsoft-IIS/6.0  

X-Powered-By: ASP.NET  

Date: Wed, 16 Nov 2005 01:57:54 GMT  

Connection: close   

先定义一个函数 getRange() 这个函数用来处理 header中 Range 具体数据的处理,代码如下:

/** $file_size  文件大小 */ 

 function getRange($file_size){  

    $range = isset($_SERVER['HTTP_RANGE'])?$_SERVER['HTTP_RANGE']:null;  

    if(!emptyempty($range)){  

        $range = preg_replace('/[s|,].*/', '', $range);  

        $range = explode('-',substr($range,6));  

        if (count($range) < 2 ) {  

            $range[1] = $file_size;  

        }  

        $range = array_combine(array('start','end'),$range);  

        if (emptyempty($range['start'])) {  

            $range['start'] = 0;  

        }  

        if (!isset ($range['end']) || emptyempty($range['end'])) {  

            $range['end'] = $file_size;  

        }  

        return $range;  

    }  

    return null;  

假设文件的地址为 $file_path,代码如下:

$speed = 512;//此参数为下载最大速度  

$pos = strrpos($file_path, "/");  

$file_name = substr($file_path, $pos+1);  

$file_size = filesize($file_path);  

$ranges = getRange($file_size);  

$fh =  fopen($file_path, "rb");  

header('Cache-control: public');  

header('Content-Type: application/octet-stream');  

header('Content-Disposition: attachment; filename='.$file_name);  

if ($ranges != null) {  

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

    header('Accept-Ranges: bytes');  

    header(sprintf('Content-Length: %u',$ranges['end'] - $ranges['start']));  

    header(sprintf('Content-Range: bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size));  

    fseek($fh, sprintf('%u',$ranges['start']));  

}else{  

    header("HTTP/1.1 200 OK");  

    header(sprintf('Content-Length: %s', $file_size));  

}  

while(!feof($fh))  

{  

    echo  fread($fh, round($speed*1024, 0));  

    ob_flush();  

    sleep(1);  

}  

($fh != null) && fclose($fh); 

基本如此,就可以解决一般性文件的断点续传或者下载.

(编辑:银川站长网)

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