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,如需轉載請自行聯絡原作者
相關文章
- 使用curl斷點續傳下載檔案斷點
- 支援斷點續傳的大檔案傳輸協議斷點協議
- Android下載檔案(一)下載進度&斷點續傳Android斷點
- requests如何友好地請求下載大檔案?requests實現分段下載、斷點續傳斷點
- 1. 大檔案上傳如何斷點續傳斷點
- 大檔案上傳、斷點續傳、秒傳、beego、vue斷點GoVue
- 上傳大檔案-斷點續傳的一中方式的記錄斷點
- JAVA實現大檔案分片上傳斷點續傳Java斷點
- Node.js實現大檔案斷點續傳Node.js斷點
- Java實現檔案斷點續傳Java斷點
- Android斷點續傳下載器JarvisDownloaderAndroid斷點JAR
- 檔案下載之斷點續傳(客戶端與服務端的實現)斷點客戶端服務端
- VUE-多檔案斷點續傳、秒傳、分片上傳Vue斷點
- 檔案上傳下載攻略,斷點續傳等等那些事兒,滿滿乾貨(react&node)斷點React
- Linux如何實現斷點續傳檔案功能?Linux斷點
- Android 中 Service+Notification 斷點續傳下載Android斷點
- C#如何使用HttpClient對大檔案進行斷點上傳和下載C#HTTPclient斷點
- Java大檔案上傳、分片上傳、多檔案上傳、斷點續傳、上傳檔案minio、分片上傳minio等解決方案Java斷點
- Java多執行緒下載器FileDownloader(支援斷點續傳、代理等功能)Java執行緒斷點
- 短影片上傳怎麼做|寫個支援分片上傳/斷點續傳/秒傳功能的檔案服務吧斷點
- 轉:檔案的斷點下載服務端斷點服務端
- SpringMVC實現檔案上傳&下載(2)SpringMVC
- Struts2的檔案上傳下載
- Koa2 之檔案上傳下載
- 大檔案如何傳輸,大檔案的傳輸方式有哪些?
- 斷點續傳瞭解一下啊?斷點
- 精講RestTemplate第6篇-檔案上傳下載與大檔案流式下載REST
- 檔案上傳下載
- Spring 對檔案上傳下載的支援(Spring boot實現)Spring Boot
- 大檔案傳輸解決方案:分片上傳 / 下載限速
- JAVA檔案上傳下載Java
- springboot 檔案上傳下載Spring Boot
- 檔案上傳與下載
- Android原生下載(上篇)基本邏輯+斷點續傳Android斷點
- PHP 如何上傳檔案和下載,你學會了嗎?PHP
- SpringMVC檔案上傳下載(單檔案、多檔案)SpringMVC
- 斷點續傳教學例子斷點
- 上傳——斷點續傳之理論篇斷點
- php大檔案上傳注意事項PHP