/** php下载类,支持断点续传 可能是服务器原因 配置较低 下载一段服务器会崩溃 下载也会停止
- Func:
- download: 下载文件
- setSpeed: 设置下载速度
-
getRange: 获取header中Range
*/private $_speed = 0.1; // 下载速度
/** 下载
- @param String $file 要下载的文件路径
- @param String $name 文件名称,为空则与下载的文件名称一样
-
@param boolean $reload 是否开启断点续传
*/
public function downloadob($file, $name='', $reload=false){
if(file_exists($file)){
if($name==''){
$name = basename($file);
}$fp = fopen($file, 'rb'); $file_size = filesize($file); $ranges = $this->getRange($file_size); header('cache-control:public'); header('content-type:application/octet-stream'); header('content-disposition:attachment; filename='.$name); if($reload && $ranges!=null){ // 使用续传 header('HTTP/1.1 206 Partial Content'); header('Accept-Ranges:bytes'); // 剩余长度 header(sprintf('content-length:%u',$ranges['end']-$ranges['start'])); // range信息 header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size)); // fp指针跳到断点位置 fseek($fp, sprintf('%u', $ranges['start'])); }else{ header('HTTP/1.1 200 OK'); header('content-length:'.$file_size); } while(!feof($fp)){ echo fread($fp, round($this->_speed*1024,0)); ob_flush(); //sleep(1); // 用于测试,减慢下载速度 } ($fp!=null) && fclose($fp);
}else{
return '';
}
}
/** 设置下载速度
- @param int $speed
*/
public function setSpeed($speed){
if(is_numeric($speed) && $speed>16 && $speed<4096){
$this->_speed = $speed;
}
}
/** 获取header range信息
- @param int $file_size 文件大小
- @return Array
/
private function getRange($file_size){
if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])){
$range = $_SERVER['HTTP_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($range['start'])){
$range['start'] = 0;
}
if(empty($range['end'])){
$range['end'] = $file_size;
}
return $range;
}
return null;
}
public function download(){
$id = input('id'); $item = Db::name('imgsubmit')->where(['id'=>$id])->find(); Db::name('imgsubmit')->where(['id'=>$id])->update(['status'=>1]); $tt = ltrim($item['zip'],'uploads/'); $path = config('upload_path').DS.$tt; $arr = explode('/',$path); $iname=$item['username'].'_'.$item['order_no']; // /*$filename = $arr[count($arr)-1];*/ $filename=$iname.'.zip'; //$file = fopen($path, "rb"); //$flag = $this->downFile($path); $flag = $this->downloadob($path, $filename, true); // 断点续传 exit ();
}
本文转自lb沫51CTO博客,原文链接:http://blog.51cto.com/13562606/2066551
,如需转载请自行联系原作者