PHP支持断点续传实例代码
让PHP下载代码支持断点续传,主要靠的 HTTP协议中header Content-Range来实现.
先来说说 HTTP的下载原理
对于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可,代码如下:
GET /Path/FileName HTTP/1.0
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 (! empty empty ( $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 ( empty empty ( $range [ 'start' ])) { $range [ 'start' ] = 0; } if (!isset ( $range [ 'end' ]) || empty empty ( $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 );基本如此,就可以解决一般性文件的断点续传或者下载.
查看更多关于PHP支持断点续传实例代码 - php上传下载的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did29359