PHP 关于文件上传下载 断点续传问题
1 /** $file_size 文件大小 */ 2 ?function getRange($file_size){ 3 $range = isset($_SERVER['HTTP_RANGE'])?$_SERVER['HTTP_RANGE']:null; 4 if(!empty($range)){ 5 $range = preg_replace('/[\s|,].*/', '', $range); 6 $range = explode('-',substr($range,6)); 7 if (count($range) < 2 ) { 8 $range[1] = $file_size; 9 }10 $range = array_combine(array('start','end'),$range);11 if (empty($range['start'])) {12 $range['start'] = 0;13 }14 if (!isset ($range['end']) || empty($range['end'])) {15 $range['end'] = $file_size;16 }17 return $range;18 }19 return null;20 }假设文件的地址为 $file_path
1 $speed = 512;//此参数为下载最大速度 2 ?$pos = strrpos($file_path, "/"); 3 ?$file_name = substr($file_path, $pos+1); 4 $file_size = filesize($file_path); 5 $ranges = getRange($file_size); 6 $fh = fopen($file_path, "rb"); 7 header('Cache-control: public'); 8 header('Content-Type: application/octet-stream'); 9 header('Content-Disposition: attachment; filename='.$file_name);10 if ($ranges != null) {11 header('HTTP/1.1 206 Partial Content');12 header('Accept-Ranges: bytes');13 header(sprintf('Content-Length: %u',$ranges['end'] - $ranges['start']));14 header(sprintf('Content-Range: bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size));15 fseek($fh, sprintf('%u',$ranges['start']));16 }else{17 header("HTTP/1.1 200 OK");18 header(sprintf('Content-Length: %s', $file_size));19 }20 while(!feof($fh))21 {22 echo fread($fh, round($speed*1024, 0));23 ob_flush();24 sleep(1);25 }26 ($fh != null) && fclose($fh);基本如此 就可以解决一般性文件的断点续传或者下载了