PHP大檔案下載(方式2支援斷點續傳)
/** 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,如需轉載請自行聯絡原作者
相關文章
- PHP大檔案下載(方式1不支援斷點續傳)PHP斷點
- php 支援斷點續傳的檔案下載類PHP斷點
- PHP實現檔案下載斷點續傳詳解PHP斷點
- 使用curl斷點續傳下載檔案斷點
- Winform檔案下載之斷點續傳ORM斷點
- 支援斷點續傳的大檔案傳輸協議斷點協議
- C# 檔案下載之斷點續傳C#斷點
- iOS大檔案斷點續傳iOS斷點
- C# FTP上傳下載(支援斷點續傳)C#FTP斷點
- C# 上傳下載ftp(支援斷點續傳)C#FTP斷點
- Android下載檔案(一)下載進度&斷點續傳Android斷點
- requests如何友好地請求下載大檔案?requests實現分段下載、斷點續傳斷點
- 1. 大檔案上傳如何斷點續傳斷點
- 大檔案上傳、斷點續傳、秒傳、beego、vue斷點GoVue
- 上傳大檔案-斷點續傳的一中方式的記錄斷點
- 讓自定義檔案下載支援斷點續傳(HTTP_RANGE Adodb.Stream) (轉)斷點HTTP
- JAVA實現大檔案分片上傳斷點續傳Java斷點
- 大檔案斷點下載(NSURLConnection)斷點
- Node.js實現大檔案斷點續傳Node.js斷點
- Android okhttp+rxjava實現多檔案下載和斷點續傳AndroidHTTPRxJava斷點
- HTTP檔案斷點續傳的原理HTTP斷點
- Java實現檔案斷點續傳Java斷點
- 無外掛實現大檔案分片上傳,斷點續傳斷點
- OkHttp使用+檔案的上傳+斷點續傳HTTP斷點
- iOS開發網路篇之檔案下載、大檔案下載、斷點下載iOS斷點
- 使用webuploader元件實現大檔案分片上傳,斷點續傳Web元件斷點
- 檔案下載之斷點續傳(客戶端與服務端的實現)斷點客戶端服務端
- 利用HTTP協議實現檔案下載的多執行緒斷點續傳HTTP協議執行緒斷點
- 支援斷點續傳的檔案上傳外掛——Huploadify-V2.0來了斷點
- VUE-多檔案斷點續傳、秒傳、分片上傳Vue斷點
- 檔案上傳下載攻略,斷點續傳等等那些事兒,滿滿乾貨(react&node)斷點React
- Linux斷點續傳檔案功能詳解Linux斷點
- Android 中 Service+Notification 斷點續傳下載Android斷點
- Android斷點續傳下載器JarvisDownloaderAndroid斷點JAR
- iOS11 下載之斷點續傳的bugiOS斷點
- iOS 開發之 NSURLSession 下載和斷點續傳iOSSession斷點
- Linux如何實現斷點續傳檔案功能?Linux斷點
- Java多執行緒下載器FileDownloader(支援斷點續傳、代理等功能)Java執行緒斷點