博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php断点续传
阅读量:4347 次
发布时间:2019-06-07

本文共 2539 字,大约阅读时间需要 8 分钟。

1 class FileDownload{ // class start  2    3   private $_speed = 512;  // 下载速度  4    5   /** 下载  6   * @param String $file  要下载的文件路径  7   * @param String $name  文件名称,为空则与下载的文件名称一样  8   * @param boolean $reload 是否开启断点续传  9   */10   public function download($file, $name='', $reload=false){ 11     if(file_exists($file)){ 12       if($name==''){ 13         $name = basename($file); 14       } 15   16       $fp = fopen($file, 'rb'); 17       $file_size = filesize($file); 18       $ranges = $this->getRange($file_size); 19   20       header('cache-control:public'); 21       header('content-type:application/octet-stream'); 22       header('content-disposition:attachment; filename='.$name); 23   24       if($reload && $ranges!=null){ // 使用续传 25         header('HTTP/1.1 206 Partial Content'); 26         header('Accept-Ranges:bytes'); 27           28         // 剩余长度 29         header(sprintf('content-length:%u',$ranges['end']-$ranges['start'])); 30           31         // range信息 32         header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size)); 33           34         // fp指针跳到断点位置 35         fseek($fp, sprintf('%u', $ranges['start'])); 36       }else{ 37         header('HTTP/1.1 200 OK'); 38         header('content-length:'.$file_size); 39       } 40   41       while(!feof($fp)){ 42         echo fread($fp, round($this->_speed*1024,0)); 43         ob_flush(); 44         //sleep(1); // 用于测试,减慢下载速度 45       } 46   47       ($fp!=null) && fclose($fp); 48   49     }else{ 50       return ''; 51     } 52   } 53   54   /** 设置下载速度 55   * @param int $speed 56   */57   public function setSpeed($speed){ 58     if(is_numeric($speed) && $speed>16 && $speed<4096){ 59       $this->_speed = $speed; 60     } 61   } 62   63   /** 获取header range信息 64   * @param int  $file_size 文件大小 65   * @return Array 66   */67   private function getRange($file_size){ 68     if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])){ 69       $range = $_SERVER['HTTP_RANGE']; 70       $range = preg_replace('/[\s|,].*/', '', $range); 71       $range = explode('-', substr($range, 6)); 72       if(count($range)<2){ 73         $range[1] = $file_size; 74       } 75       $range = array_combine(array('start','end'), $range); 76       if(empty($range['start'])){ 77         $range['start'] = 0; 78       } 79       if(empty($range['end'])){ 80         $range['end'] = $file_size; 81       } 82       return $range; 83     } 84     return null; 85   } 86 }

 

转载于:https://www.cnblogs.com/tm2015/p/4739634.html

你可能感兴趣的文章
并发编程(十):AQS
查看>>
条件注释判断浏览器版本<!--[if lt IE 9]>
查看>>
Comparison among several SGD derivation
查看>>
ModelAndView同时向页面传递多个参数
查看>>
samba 配置参数详解
查看>>
python基础09_文件操作
查看>>
mvn install selenium依赖包
查看>>
关于SQL的相关笔记【长期更新,只发一帖】
查看>>
linux awk命令详解
查看>>
android:id="@+id/button1" 与 android:id="@id/button1" 区别 @string
查看>>
手把手玩转win8开发系列课程(11)
查看>>
Linux Namespace : User
查看>>
交换两个整形变量的数值
查看>>
Linux----常用操作
查看>>
sequence
查看>>
Delphi错误:Stack overflow的解决方法
查看>>
取消chrome(谷歌浏览器)浏览器下最小字体限制
查看>>
模板方法模式
查看>>
什么是ECC内存?
查看>>
使用Visual Studio 2013进行UI自动化测试
查看>>