<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # PHP文件下載   通常來說,php支持斷點續傳,主要依靠HTTP協議中 header HTTP_RANGE實現。 ## HTTP斷點續傳原理 Http頭 Range、Content-Range() HTTP頭中一般斷點下載時才用到Range和Content-Range實體頭, Range用戶請求頭中,指定第一個字節的位置和最后一個字節的位置,如(Range:200-300) Content-Range用于響應頭 ## 請求下載整個文件 GET /test.rar HTTP/1.1 Connection: close Host: 116.1.219.219 Range: bytes=0-801 //一般請求下載整個文件是bytes=0- 或不用這個頭 ## 一般正常回應 HTTP/1.1 200 OK Content-Length: 801 Content-Type: application/octet-stream Content-Range: bytes 0-800/801 //801:文件總大小 ## FileDownload.class.php類文件代碼如下 ~~~ <?php /** php下載類,支持斷點續傳 * download: 下載文件 * setSpeed: 設置下載速度 * getRange: 獲取header中Range */ class FileDownload{ // class start private $_speed = 512; // 下載速度 /** 下載 * @param String $file 要下載的文件路徑 * @param String $name 文件名稱,為空則與下載的文件名稱一樣 * @param boolean $reload 是否開啟斷點續傳 */ public function download($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; } } ?> ~~~ ## 使用方法如下 ~~~ <?php require('FileDownload.class.php'); $file = 'book.zip'; $name = time().'.zip'; $obj = new FileDownload(); $flag = $obj->download($file, $name); //$flag = $obj->download($file, $name, true); // 斷點續傳 if(!$flag){ echo 'file not exists'; } ?> ~~~ ## 斷點續傳測試方法 使用linux `wget`命令去測試下載, `wget -c -O file http://xxx` ### 未開啟斷點續傳的方式下載 ~~~ [root@luo_centos6.7 /usr/local/nginx/html/upload] # wget -c -O test.tar.gz http://192.168.2.222/upload/index.php --2016-01-08 19:05:04-- http://192.168.2.222/upload/index.php 正在連接 192.168.2.222:80... 已連接。 已發出 HTTP 請求,正在等待回應... 200 OK 長度:104857600 (100M) [application/octet-stream] 正在保存至: “test.tar.gz” 46% [=======================================> ] 48,755,480 227M/s [root@luo_centos6.7 /usr/local/nginx/html/upload] # wget -c -O test.tar.gz http://192.168.2.222/upload/index.php --2016-01-08 19:05:08-- http://192.168.2.222/upload/index.php 正在連接 192.168.2.222:80... 已連接。 已發出 HTTP 請求,正在等待回應... 200 OK 長度:104857600 (100M) [application/octet-stream] 正在保存至: “test.tar.gz” 100%[======================================================================================>] 104,857,600 52.1M/s in 1.9s 2016-01-08 19:05:10 (52.1 MB/s) - 已保存 “test.tar.gz” [104857600/104857600]) ~~~ **可以看到,wget -c不能斷點續傳** ### 開啟斷點續傳 ~~~ [root@luo_centos6.7 /usr/local/nginx/html/upload] # wget -c -O test2.tar.gz http://192.168.2.222/upload/index2.php --2016-01-08 19:06:00-- http://192.168.2.222/upload/index2.php 正在連接 192.168.2.222:80... 已連接。 已發出 HTTP 請求,正在等待回應... 200 OK 長度:104857600 (100M) [application/octet-stream] 正在保存至: “test2.tar.gz” 36% [===============================> ] 38,757,893 9.90M/s eta(英國中部時間) 6s [root@luo_centos6.7 /usr/local/nginx/html/upload] # wget -c -O test2.tar.gz http://192.168.2.222/upload/index2.php --2016-01-08 19:06:07-- http://192.168.2.222/upload/index2.php 正在連接 192.168.2.222:80... 已連接。 已發出 HTTP 請求,正在等待回應... 206 Partial Content 長度:104857601 (100M),66099708 (63M) 字節剩余 [application/octet-stream] 正在保存至: “test2.tar.gz” 100%[++++++++++++++++++++++++++++++++======================================================>] 104,857,601 52.3M/s in 1.2s 2016-01-08 19:06:08 (52.3 MB/s) - 已保存 “test2.tar.gz” [104857601/104857601]) ~~~ 可以看到會從斷點的位置(36%)開始下載。 # 拓展 | header頭 | 釋義 | | -- | -- | | header("Content-type:text/html;charset=utf-8") | 在服務器響應瀏覽器的請求時,告訴瀏覽器以編碼格式為UTF-8的編碼顯示該內容 | | Header("Content-type: application/octet-stream") | 通過這句代碼客戶端瀏覽器就能知道服務端返回的文件形式 | | Header("Accept-Ranges: bytes") | 告訴客戶端瀏覽器返回的文件大小是按照字節進行計算的 | | Header("Accept-Length:".$file_size) | 告訴瀏覽器返回的文件大小 | | Header("Content-Disposition: attachment; filename=".$file_name) | 告訴瀏覽器返回的文件的名稱 | 以上四個Header()是必需的 fclose($fp)可以把緩沖區內最后剩余的數據輸出到磁盤文件中,并釋放文件指針和有關的緩沖區 [TOC]
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看