好得很程序员自学网

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

php支持分块与断点续传文件下载功能代码 - php上

php支持分块与断点续传文件下载功能代码

本文章要介绍了这篇文章是一篇关于php流下载,就是可以支持分块与断点续传文件下载,有需要的朋友可以看看,代码如下:

$dowmFile  = dirname (  __FILE__  ) .  '/Nokia - Always Here.mp3' ;  //要下载的文件,绝对或相对   $dowmName  =  'Nokia - Always Here.mp3' ;  ob_start ();  getlocalfile (  $dowmFile ,  $dowmName  );  flush  ();  ob_flush ();  function  getlocalfile( $fname ,  $filename  =  '' ) {     $fsize  =  filesize  (  $fname  );    header (  'Cache-Control: public'  );    header (  'Pragma: public'  );    header (  'Accept-Ranges: bytes'  );    header (  'Connection: close'  );    header (  'Content-Type: '  . MIMEType (  $fname  ) );     //header('Content-Type: application/octet-stream');      if  (isset (  $filename  {0} )) {      header (  'Content-Disposition: attachment;filename='  .  $filename  );    }     if  ( $fp  = @ fopen  (  $fname ,  'rb'  )) {       $start  = 0;       $end  =  $fsize ;       $isRange  = isset (  $_SERVER  [ 'HTTP_RANGE' ] ) && ( $_SERVER  [ 'HTTP_RANGE' ] !=  '' );       if  ( $isRange ) {        preg_match (  '/^bytes=([0-9]*)-([0-9]*)$/i' ,  $_SERVER  [ 'HTTP_RANGE' ],  $match  );         $start  =  $match  [1];         $end  =  $match  [2];         $isset_start  = isset (  $start  {0} );         $isset_end  = isset (  $end  {0} );         if  ( $isset_start  &&  $isset_end ) {           //分块下载            if  ( $start  >=  $fsize  ||  $start  < 0 ||  $start  >  $end ) {             $start  = 0;             $end  =  $fsize ;          }  else   if  ( $end  >=  $fsize ) {             $end  =  $fsize  -  $start ;          }  else  {             $end  -=  $start  - 1;          }        }  else   if  ( $isset_start  && !  $isset_end ) {           //指定位置到结束            if  ( $start  >=  $fsize  ||  $start  < 0) {             $start  = 0;             $end  =  $fsize ;          }  else  {             $end  =  $fsize  -  $start ;          }        }  else   if  (!  $isset_start  &&  $isset_end ) {           //最后n个字节            $end  =  $end  >  $fsize  ?  $fsize  :  $end ;           $start  =  $fsize  -  $end ;        }  else  {           $start  = 0;           $end  =  $fsize ;        }      }       if  ( $isRange ) {         fseek  (  $fp ,  $start  );        header (  'HTTP/1.1 206 Partial Content'  );        header (  'Content-Length: '  .  $end  );        header (  'Content-Ranges: bytes '  .  $start  .  '-'  . ( $end  +  $start  - 1) .  '/'  .  $fsize  );      }  else  {        header (  'Content-Length: '  .  $fsize  );      }       if  (function_exists (  'fpassthru'  ) && ( $end  +  $start ) ==  $fsize ) {         fpassthru  (  $fp  );      }  else  {         echo   fread  (  $fp ,  $end  );      }    }  else  {      header (  'Content-Length: '  .  $fsize  );      readfile (  $fname  );    }     //@header("Content-Type: ".mime_content_type($fname));   }  function  MIMEType( $fname ) {     $fileSuffix  =  strtolower  (  substr  (  $fname ,  strrpos  (  $fname ,  '.'  ) + 1 ) );     switch  ( $fileSuffix ) {       case   'avi'  :         return   'video/msvideo' ;       case   'wmv'  :         return   'video/x-ms-wmv' ;       case   'txt'  :         return   'text/plain' ;       case   'htm'  :       case   'html'  :       case   'php'  :         return   'text/html' ;       case   'css'  :         return   'text/css' ;       case   'js'  :         return   'application/javascript' ;       case   'json'  :       case   'xml'  :       case   'zip'  :       case   'pdf'  :       case   'rtf'  :       case   'tar'  :         return   'application/'  .  $fileSuffix ;       case   'swf'  :         return   'application/x-shockwave-flash' ;       case   'flv'  :         return   'video/x-flv' ;       case   'jpe'  :       case   'jpg'  :         return   'image/jpeg' ;       case   'jpeg'  :       case   'png'  :       case   'gif'  :       case   'bmp'  :       case   'tiff'  :         return   'image/'  .  $fileSuffix ;       case   'ico'  :         return   'image/vnd.microsoft.icon' ;       case   'tif'  :         return   'image/tiff' ;       case   'svg'  :       case   'svgz'  :         return   'image/svg+xml' ;       case   'rar'  :         return   'application/x-rar-compressed' ;       case   'exe'  :       case   'msi'  :         return   'application/x-msdownload' ;       case   'cab'  :         return   'application/vnd.ms-cab-compressed' ;       case   'aif'  :         return   'audio/aiff' ;       case   'mpg'  :       case   'mpe'  :       case   'mp3'  :         return   'audio/mpeg' ;       case   'mpeg'  :       case   'wav'  :       case   'aiff'  :         return   'audio/'  .  $fileSuffix ;       case   'qt'  :       case   'mov'  :         return   'video/quicktime' ;       case   'psd'  :         return   'image/vnd.adobe.photoshop' ;       case   'ai'  :       case   'eps'  :       case   'ps'  :         return   'application/postscript' ;       case   'doc'  :       case   'docx'  :         return   'application/msword' ;       case   'xls'  :       case   'xlt'  :       case   'xlm'  :       case   'xld'  :       case   'xla'  :       case   'xlc'  :       case   'xlw'  :       case   'xll'  :         return   'application/vnd.ms-excel' ;       case   'ppt'  :       case   'pps'  :         return   'application/vnd.ms-powerpoint' ;       case   'odt'  :         return   'application/vnd.oasis.opendocument.text' ;       case   'ods'  :         return   'application/vnd.oasis.opendocument.spreadsheet' ;       default  : //开源代码phpfensi.com          if  (function_exists (  'mime_content_type'  )) {           $fileSuffix  = mime_content_type (  $filename  );        }  else  {           $fileSuffix  =  'application/octet-stream' ;        }         return   $fileSuffix ;         break ;    }  } 

查看更多关于php支持分块与断点续传文件下载功能代码 - php上的详细内容...

  阅读:65次