ホームページ  >  記事  >  バックエンド開発  >  ブレークポイント再開転送をサポートするファイルダウンロード php クラスを実装しました。

ブレークポイント再開転送をサポートするファイルダウンロード php クラスを実装しました。

WBOY
WBOYオリジナル
2016-07-25 08:42:491845ブラウズ

この記事では、ブレークポイントの再開ダウンロードをサポートする 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 クラス ファイルのコードは次のとおりです:

  1. /**
  2. * ダウンロード クラス、ダウンロードの再開をサポートします
  3. * @time: 2015 06 30 09:36
  4. * @author:guoyu@xzdkiosk.com
  5. * PHP ダウンロード クラス、ダウンロードの再開をサポートします
  6. * Func:
  7. * download: ファイルをダウンロードします
  8. * setSpeed: ダウンロード速度を設定します
  9. * getRange: ヘッダーの範囲を取得します
  10. */
  11. class FileDownload{ // クラス開始
  12. private $_speed = 512;ダウンロード速度
  13. /**ダウンロード
  14. * @param String $file ダウンロードするファイルのパス
  15. * @param String $name ファイル名、空の場合はダウンロードしたファイル名と同じになります
  16. * @param boolean $reload かどうかブレークポイント再開を有効にするには
  17. */
  18. public function download($file, $name='', $reload=false){
  19. if(file_exists($file)){
  20. if($name==' ') {
  21. $name = ベース名($file)
  22. }
  23. $fp = fopen($file, 'rb');
  24. $ranges = $this->getRange; ($ file_size);
  25. header('cache-control:public');
  26. header('content-disposition:attachment; filename='.$name) );
  27. if($reload && $ranges!=null){ // 再開を使用
  28. header('HTTP/1.1 206 Partial Content')
  29. // 残りlength
  30. header(sprintf('content-length:%u',$ranges['end']-$ranges['start']));
  31. // 範囲情報
  32. header(sprintf('content-range:bytes) % s-%s/%s', $ranges['start'], $ranges['end'], $file_size));
  33. // fp ポインターはブレークポイントの位置にジャンプします
  34. fseek($fp, sprintf) (' %u', $ranges['start']));
  35. }else{
  36. header('content-length:'.$file_size); while( !feof($fp)){
  37. echo fread($fp,round($this->_speed*1024,0));
  38. ob_flush(); // テスト用マイナス ダウンロード速度が遅い
  39. }
  40. ($fp!=null) && fclose($fp);
  41. }else{
  42. return '';
  43. /**ダウンロード速度を設定します
  44. * @param int $speed
  45. */
  46. public function setSpeed ( $speed){
  47. if(is_numeric($speed) && $speed>16 && $speed<4096){
  48. $this->_speed = $speed;
  49. }
  50. }
  51. /**ヘッダー範囲情報を取得
  52. * @param int $file_size ファイルサイズ
  53. * @return Array
  54. */
  55. プライベート関数 getRange($file_size){
  56. if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])){
  57. $range = $_SERVER['HTTP_RANGE']
  58. $ range = preg_replace('/[s|,].*/', '', $range);
  59. $range =explode('-', substr($range, 6)); < ;2){
  60. $range[1] = $file_size;
  61. }
  62. $range = array_combine(array('start','end'), $range); ) ){
  63. $range['start'] = 0;
  64. }
  65. if(empty($range['end'])){
  66. $range['end'] = $file_size
  67. }
  68. return $range;
  69. }
  70. return null;
  71. }
  72. } // クラス終了
  73. ?>コードをコピー

デモ コードは次のとおりです:
  1. require('FileDownload.class.php');
  2. $file = 'book.zip'
  3. $name = time().'.zip'; ;
  4. $obj = new FileDownload();
  5. $flag = $obj->download($file, $name);
  6. //$flag = $obj->download($file, $name, true); // ブレークポイントからアップロードを再開します
  7. if(!$flag){
  8. echo 'ファイルが存在しません' }
コードをコピーします
;
再開可能なダウンロードのテスト方法:

Linux wget コマンドを使用してダウンロードをテストします (wget -c -O file http://xxx)

1. まずブレークポイント再開をオフにします

$flag = $obj->down​​load($file, $name);
  1. コードをコピーします

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
  1. 接続中demo.test.com|127.0.0.1|:80... 接続されました。
  2. HTTP リクエストが送信され、応答を待っています... 200 OK
  3. 長さ: 10445120 (10.0M) [application/octet-stream]
  4. 保存先: “test.rar”
  5. 30% [====== == ====================> ] 3,146,580 513K/s 推定時間 14 秒
  6. ^C
  7. test@ubuntu:~/Downloads$ wget -c -O test .rar http://demo.test.com/demo.php
  8. --2013-06-30 16:52:57-- http://demo.test.com/demo.php
  9. ホストdemo.test .comを解決しています。 .. 127.0.0.1
  10. 接続中 Demon.test.com|127.0.0.1|:80... 接続されました。
  11. HTTP リクエストが送信され、応答を待っています... 200 OK
  12. 長さ: 10445120 (10.0M) [application/octet-stream]
  13. 保存先: “test.rar”
  14. 30% [======== = ====================> 3,146,580 515K/s 推定時間 14 秒
  15. ^C
  16. コードをコピー
wget -c ではアップロードを再開できないことがわかります

2. ブレークポイント再開を有効にする

$flag = $obj->down​​load($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... 接続されました。
  1. HTTP リクエストが送信され、応答を待っています... 200 OK
  2. 長さ: 10445120 (10.0M) [application/octet-stream]
  3. 保存先: “test.rar”
  4. 20% [====== == ==========> ] 2,097,720 516K/秒 推定時間 16 秒
  5. ^C
  6. test@ubuntu:~/Downloads$ wget -c -O test.rar http://demo.test.com/ demo.php
  7. --2013-06-30 16:53:31-- http://demo.test.com/demo.php
  8. ホストdemo.test.com... 127.0.0.1を解決しています
  9. Connectデモを解決しています。 test.com|127.0.0.1|:80... 接続されました。
  10. HTTP リクエストが送信され、応答を待機しています... 206 部分コンテンツ
  11. 長さ: 10445121 (10.0M)、7822971 (7.5M) 残りバイト [application/octet-stream]
  12. 保存先: “test.rar”
  13. 100% [++++++++++++++++++++++++===================== === ============================================== ]
  14. ブレークポイントの位置 (%20) からダウンロードが開始されることがわかります。
  15. 出典: http://blog.csdn.net/phpfenghuo/article/details/46691865
ブレークポイント、php からアップロードを再開します




声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。