phpダウンロードクラス
3930 ワード
$obj = new FileDownload();
$flag = $obj->download($fileUrl, $fileName);//fileUrl ,fileName :hello.mp4
class FileDownload{
/**
* @param String $file
* @param String $name ,
* @param boolean $reload
*/
public function download($file, $name='', $reload=false){
$fp = @fopen($file, 'rb');
if($fp){
if($name==''){
$name = basename($file);
}
$header_array = get_headers($file, true);
$file_size = $header_array['Content-Length'];
$ranges = $this->getRange($file_size);
$ua = $_SERVER["HTTP_USER_AGENT"];//
header('cache-control:public');
header('content-type:application/octet-stream');
$encoded_filename = urlencode($name);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
//
if (preg_match("/MSIE/", $ua) || preg_match("/Trident/", $ua) ){
header('Content-Disposition: attachment; filename="' .$encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename*="utf8\'\'' . $name . '"');
}else if (preg_match("/Chrome/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else {
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)){
ob_clean();
echo fread($fp, 4096);
//echo fread($fp, round($this->_speed*1024,0));
//echo fread($fp, $file_size);
ob_flush();
}
($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;
}
}