ホームページ  >  記事  >  バックエンド開発  >  ブレークポイント・レジューム転送をサポートするPHPファイルダウンロードクラス(ソースコード添付)

ブレークポイント・レジューム転送をサポートするPHPファイルダウンロードクラス(ソースコード添付)

WBOY
WBOYオリジナル
2016-07-25 08:55:241069ブラウズ
  1. /**PHP ダウンロード クラス、ブレークポイント レジュームをサポート
  2. * 日付: 2013-06-30
  3. * 著者: fdipzone
  4. * Ver: 1.0
  5. * edit: ww.jbxue.com
  6. * Func:
  7. * download: ファイルをダウンロード
  8. * setSpeed : Setダウンロード速度
  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); $fp = fopen($file, 'rb');
  22. $file_size = ファイルサイズ($file);
  23. $ranges = $this->getRange($file_size);
  24. header('cache-control:public');
  25. header('content-type:application/octet-stream');
  26. header('content-disposition:attachment; filename='.$name);
  27. if($reload && $ranges!=null){ // 续传
  28. header('HTTP/1.1 206 Partial Content') を使用します。
  29. header('Accept-Ranges:bytes');
  30. // 残り長さ
  31. header(sprintf('content-length:%u',$ranges['end']-$ranges['start']));
  32. // range情報
  33. header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size));
  34. // fp指针跳躍点位置
  35. fseek($fp, sprintf('%u', $ranges['start']));
  36. }else{
  37. header('HTTP/1.1 200 OK');
  38. header('content-length:'.$file_size);
  39. }
  40. while(!feof($fp)){
  41. echo fread($fp,round($this->_speed*1024,0));
  42. ob_flush();
  43. //スリープ(1); // 测试用,减ゆっくりダウンロード速度
  44. }
  45. ($fp!=null) && fclose($fp);
  46. }else{
  47. return '';
  48. }
  49. }
  50. /**ダウンロード速度を設定します
  51. * @param int $speed
  52. */
  53. public function setSpeed($speed){
  54. if(is_numeric($speed) && $speed>16 && $speed<4096){
  55. $this->_speed = $スピード;
  56. }
  57. }
  58. /**ヘッダー範囲情報を取得
  59. * @param int $file_size ファイルサイズ
  60. * @return Array
  61. */
  62. プライベート関数 getRange($file_size){
  63. if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])){
  64. $range = $_SERVER['HTTP_RANGE'];
  65. $range = preg_replace('/[s|,].*/', '', $range);
  66. $range =explode('-', substr($range, 6));
  67. if(count($range)<2){
  68. $range[1] = $file_size;
  69. }
  70. $range = array_combine(array('start','end'), $range);
  71. if(empty($range['start'])){
  72. $range['start'] = 0;
  73. }
  74. if(empty($range['end'])){
  75. $range['end'] = $file_size;
  76. }
  77. $range を返します。
  78. }
  79. null を返します。
  80. }
  81. } // クラス終了
  82. ?>
  83. 复制代
2、演示例demo.php

require('FileDownload.class.php');
  • $file = 'book.zip';
  • $name = time().'.zip';
  • $obj = 新しい 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->down​​load($file, $name);
    1. 复制代码

    wget コマンドを使用してブレークポイントの再開をテストします。

    1. root@jbxue:~/Downloads$ wget -O test.rar http://demo.fdipzone.com/demo.php
    2. --2013-06-30 16:52:44-- http: //demo.fdipzone.com/demo.php
    3. ホストを解決していますdemo.fdipzone.com... 127.0.0.1
    4. 接続demo.fdipzone.com|127.0.0.1|:80... 接続されました。
    5. HTTP リクエストが送信されました、応答を待っています... 200 OK
    6. 長さ: 10445120 (10.0M) [application/octet-stream]
    7. 保存先: “test.rar”
    8. 30% [======== = ====================> 3,146,580 513K/s 推定時間 14 秒
    9. ^C
    10. root@jbxue:~/Downloads$ wget -c -O test. http://demo.fdipzone.com/demo.php
    11. --2013-06-30 16:52:57-- http://demo.fdipzone.com/demo.php
    12. ホストdemo.fdipzone comを解決しています。 .. 127.0.0.1
    13. 接続デモ.fdipzone.com|127.0.0.1|:80... 接続されました。
    14. HTTP リクエストが送信されました、応答を待っています... 200 OK
    15. 長さ: 10445120 (10.0M) [application/octet-stream]
    16. 保存先: “test.rar”
    17. 30% [======== = ====================> 3,146,580 515K/s 推定時間 14 秒
    18. ^C
    コードをコピー

    wget で確認できます - c ダウンロードを中断したところから再開することはできません。

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

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

    wget コマンドを使用して再開機能をテストします。

    1. root@jbxue:~/Downloads$ wget -O test.rar http://demo.fdipzone.com/demo.php
    2. --2013-06-30 16:53:19-- http: //demo.fdipzone.com/demo.php
    3. ホストを解決していますdemo.fdipzone.com... 127.0.0.1
    4. 接続demo.fdipzone.com|127.0.0.1|:80... 接続されました。
    5. HTTP リクエストが送信されました、応答を待っています... 200 OK
    6. 長さ: 10445120 (10.0M) [application/octet-stream]
    7. 保存先: “test.rar”
    8. 20% [====== == ==========> ] 2,097,720 516K/秒 推定時間 16 秒
    9. ^C
    10. root@jbxue:~/Downloads$ wget -c -O test.rar http://demo.fdipzone com/ demo.php
    11. --2013-06-30 16:53:31-- http://demo.fdipzone.com/demo.php
    12. ホストdemo.fdipzone.com... 127.0.0.1を解決しています
    13. Connectデモを解決しています。 fdipzone.com|127.0.0.1|:80... 接続されました。
    14. HTTP リクエストが送信され、応答を待機しています... 206 部分コンテンツ
    15. 長さ: 10445121 (10.0M)、7822971 (7.5M) 残りバイト [application/octet-stream]
    16. 保存先: “test.rar”
    17. 100% [++++++++++++++++++++++++========================= ========>] 10,445,121 543K/s に 14 秒かかりました
    18. 2013-06-30 16:53:45 (543 KB/s) - "test.rar" [10445121/10445121] ) を保存しました
    コードをコピーします
    ブレークポイントの位置 (%20) からダウンロードが開始されることがわかります。

    PHPファイルダウンロードクラスのソースコードダウンロードアドレスを添付(ブレークポイント再開ダウンロードをサポート)


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