好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP支持断点续传实例代码 - php上传下载

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上传下载的详细内容...

  阅读:69次