この記事では、ブレークポイントの再開ダウンロードをサポートする PHP で実装されたファイル ダウンロード クラスとその使用法について説明します。これは非常に実用的なテクニックです。皆さんの参考に共有してください。具体的な方法は以下の通りです
一般に、PHP はブレークポイントの再開をサポートしており、主に HTTP プロトコルのヘッダー HTTP_RANGE に依存します。
HTTP ブレークポイント再開原則:
HTTP ヘッダー Range、Content-Range() Range および Content-Range エンティティ ヘッダーは、通常、ブレークポイント ダウンロードの場合にのみ HTTP ヘッダーで使用されます。 Range ユーザー リクエスト ヘッダーでは、最初のバイトと最後のバイトの位置を指定します。 (範囲: 200-300) のような位置 Content-Range は応答ヘッダーに使用されます
ファイル全体のダウンロードをリクエスト:
GET /test.rar HTTP/1.1 接続: 閉じる ホスト: 116.1.219.219 範囲: bytes=0-801 //ファイル全体をダウンロードする一般的なリクエストは bytes=0- であるか、このヘッダーを使用しないでください
通常の応答:
HTTP/1.1 200 OK Content-Length: 801 Content-Type: application/octet-stream Content-Range: バイト 0-800/801 //801: 合計ファイル サイズ
FileDownload.class.php クラス ファイルのコードは次のとおりです:
- /**
- * ダウンロード クラス、ダウンロードの再開をサポートします
- * @time: 2015 06 30 09:36
- * @author:guoyu@xzdkiosk.com
- * PHP ダウンロード クラス、ダウンロードの再開をサポートします
- * Func:
- * download: ファイルをダウンロードします
- * setSpeed: ダウンロード速度を設定します
- * getRange: ヘッダーの範囲を取得します
- */
-
- class FileDownload{ // クラス開始
-
- 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 = ベース名($file)
- }
- $fp = fopen($file, 'rb');
- $ranges = $this->getRange; ($ file_size);
-
- header('cache-control:public');
- header('content-disposition:attachment; filename='.$name) );
-
- if($reload && $ranges!=null){ // 再開を使用
- header('HTTP/1.1 206 Partial Content')
-
- // 残りlength
- header(sprintf('content-length:%u',$ranges['end']-$ranges['start']));
-
- // 範囲情報
- header(sprintf('content-range:bytes) % s-%s/%s', $ranges['start'], $ranges['end'], $file_size));
-
- // fp ポインターはブレークポイントの位置にジャンプします
- fseek($fp, sprintf) (' %u', $ranges['start']));
- }else{
- header('content-length:'.$file_size); while( !feof($fp)){
- echo fread($fp,round($this->_speed*1024,0));
- 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;
- }
- }
-
- /**ヘッダー範囲情報を取得
- * @param int $file_size ファイルサイズ
- * @return Array
- */
- プライベート関数 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)); < ;2){
- $range[1] = $file_size;
- }
- $range = array_combine(array('start','end'), $range); ) ){
- $range['start'] = 0;
- }
- if(empty($range['end'])){
- $range['end'] = $file_size
- }
- return $range;
- }
- return null;
- }
- } // クラス終了
-
- ?>コードをコピー
デモ コードは次のとおりです:
- 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 'ファイルが存在しません' }
コードをコピーします ;
再開可能なダウンロードのテスト方法:
Linux wget コマンドを使用してダウンロードをテストします (wget -c -O file http://xxx)
1. まずブレークポイント再開をオフにします $flag = $obj->download($file, $name);
test@ubuntu:~/Downloads$ wget -O test.rar http://demo.test.com/demo.php --2013-06-30 16:52:44-- http:/ /demo.test.com/demo.php ホストdemo.test.comを解決中... 127.0.0.1 - 接続中demo.test.com|127.0.0.1|:80... 接続されました。
- HTTP リクエストが送信され、応答を待っています... 200 OK
- 長さ: 10445120 (10.0M) [application/octet-stream]
- 保存先: “test.rar”
-
- 30% [====== == ====================> ] 3,146,580 513K/s 推定時間 14 秒
- ^C
- test@ubuntu:~/Downloads$ wget -c -O test .rar http://demo.test.com/demo.php
- --2013-06-30 16:52:57-- http://demo.test.com/demo.php
- ホストdemo.test .comを解決しています。 .. 127.0.0.1
- 接続中 Demon.test.com|127.0.0.1|:80... 接続されました。
- HTTP リクエストが送信され、応答を待っています... 200 OK
- 長さ: 10445120 (10.0M) [application/octet-stream]
- 保存先: “test.rar”
- 30% [======== = ====================> 3,146,580 515K/s 推定時間 14 秒
- ^C
-
-
- コードをコピー
wget -c ではアップロードを再開できないことがわかります
2. ブレークポイント再開を有効にする
$flag = $obj->download($file, $name, true);
test@ubuntu:~/Downloads$ wget -O test.rar http://demo.test.com/demo.php --2013-06-30 16:53:19-- http:/ /demo.test.com/demo.php ホストdemo.test.comを解決中... 127.0.0.1 接続中demo.test.com|127.0.0.1|:80... 接続されました。 - HTTP リクエストが送信され、応答を待っています... 200 OK
- 長さ: 10445120 (10.0M) [application/octet-stream]
- 保存先: “test.rar”
-
- 20% [====== == ==========> ] 2,097,720 516K/秒 推定時間 16 秒
- ^C
- test@ubuntu:~/Downloads$ wget -c -O test.rar http://demo.test.com/ demo.php
- --2013-06-30 16:53:31-- http://demo.test.com/demo.php
- ホストdemo.test.com... 127.0.0.1を解決しています
- Connectデモを解決しています。 test.com|127.0.0.1|:80... 接続されました。
- HTTP リクエストが送信され、応答を待機しています... 206 部分コンテンツ
- 長さ: 10445121 (10.0M)、7822971 (7.5M) 残りバイト [application/octet-stream]
- 保存先: “test.rar”
-
- 100% [++++++++++++++++++++++++===================== === ============================================== ]
- ブレークポイントの位置 (%20) からダウンロードが開始されることがわかります。
-
- 出典: http://blog.csdn.net/phpfenghuo/article/details/46691865
-
-
-
ブレークポイント、php からアップロードを再開します
|