新写PHP HTTP断点续传类文件代码

一个支持断点续传的PHP文件下载类文件,调用方法简单,类代码简洁,可记忆上次的下载的节点,实现累积下载,类名称download,类代码如下:

function download($path,$file) {
$real = $path.'/'.$file;
if(!file_exists($real)) {
    return false;
}
$size = filesize($real);
$size2 = $size-1;
$range = 0;
if(isset($_SERVER['HTTP_RANGE'])) {
   header('HTTP /1.1 206 Partial Content');
   $range = str_replace('=','-',$_SERVER['HTTP_RANGE']);
   $range = explode('-',$range);
   $range = trim($range[1]);
   header('Content-Length:'.$size);
   header('Content-Range: bytes '.$range.'-'.$size2.'/'.$size);
} else {
   header('Content-Length:'.$size);
   header('Content-Range: bytes 0-'.$size2.'/'.$size);
}
header('Accenpt-Ranges: bytes');
header('application/octet-stream');
header("Cache-control: public");
header("Pragma: public");
//解决在IE中下载时中文乱码问题
$ua = $_SERVER['HTTP_USER_AGENT'];
if(preg_match('/MSIE/',$ua)) {
    $ie_filename = str_replace('+','%20',urlencode($file));
    header('Content-Dispositon:attachment;filename='.$ie_filename);
} else {
    header('Content-Dispositon:attachment;filename='.$file);
}
$fp = fopen($real,'rb+');
fseek($fp,$range);
  while(!feof($fp)) {
     set_time_limit(0);
     print(fread($fp,1024));
     flush();
     ob_flush();
  }
  fclose($fp);
}

/**
  * 参数说明:
  * @param string $path: 文件路径
  * @param string $file: 文件名称
  * @return void
*/

 

posted @ 2015-03-12 21:35  壁虎漫步.  阅读(194)  评论(0编辑  收藏  举报