PHP断点续传HTTP学习笔记

HTTP断点续传原理是这样的:

1。 客户端需要告诉服务器端从哪里开始。
2。服务端收到请求、返回206状态。并标识续传的起始点及结束点

如下实例

1。 客户端传递请求信息给ウェブ服务器、要求从200070字节开始。

/ down.zip HTTP/1.1のGET
のUser-Agent:NetFox
RANGE:バイト= 200070 -
受け入れます:text / html、image / gifに、image / jpegや*; Q = 0.2、* / *; Q = 0.2

2。服务端收到这个请求以后、返回信息

206
のContent-Length = 100222222
コンテンツ範囲=バイト200070 - 100222222分の100222221
のContent-Type = application / octet-streamの

注意:服务端状态206のContent-範囲=バイト(客户端请求续传起始点) - (下载文件大小-1)/(下载文件大小)

 <?PHP / *** PHP-HTTP断点续传实现する* @ param文字列$ PATH:文件所在路径する* @ param文字列$ファイル:文件名* @ returnのはvoid * /関数のダウンロード($ PATH、$ファイル){ $リアル= $パスを '/' $ファイル;しますif(!調べるfile_exists(実数$)){falseを返す;} $サイズ=ファイルサイズ(実際の$)、$ size2の= $サイズ-1;ドルの範囲= 0;場合(かどうかの判断($ _SERVER ['HTTP_RANGE'])){ヘッダ( 'HTTP / 1.1 206部分的コンテンツ'); $範囲= str_replaceを( '='、 ' - '、$ _SERVER ['HTTP_RANGE']);ドルの範囲=爆発する( ' - '、$範囲)$の範囲=トリム(範囲[1]);ヘッダ( "Content-Lengthを '$サイズ);ヘッダ("のContent-レンジ:バイト "。ドルの範囲'  - '。$ size2の' / '$サイズ);する} else {ヘッダー(。'のContent-Length: '$サイズ);ヘッダー(。'のContent-レンジ:バイト0  -  / '$サイズ' $ size2の。 "。 );}ヘッダ( 'Accenpt-レンジ:バイト');ヘッダ( 'application / octet-streamの');ヘッダ( "キャッシュ制御:public");ヘッダ( "プラグマ:パブリック"); $ UA = $ _SERVER ['HTTP_USER_AGENT'];場合(時点でpreg_match( '/三瀬/'、$ UA)){$ ie_filename = str_replaceを( '+'、 '%20'、でurlencode($ファイル));ヘッダ( "コンテンツDispositon:添付ファイル、ファイル名= '$ ie_filename);}他{ヘッダー(。'のContent-Dispositon:添付ファイル、ファイル名= '$ファイル);}コール$ fp = fopen($本当の、は' rb + '); fseek関数($ fpは、ドルの範囲)中(はfeof($ fpは!)){set_time_limit(0);印刷(のfread($ fpは、1024));フラッシュ();するob_flush();} fcloseを($ FP);}>? 

以下是另外一段代码样例:

 <?PHP
 / *
  * PHP下载断点续传
  * /
機能dl_file_resume($ファイル){ 

     / /检测文件是否存在
    場合(調べるis_file($ファイル)!){ダイス(以下 "<b> 404ファイルが見つかりません</ b>");} 

     $ lenは=ファイルサイズ(ファイル);/ /获取文件大小
     $ファイル名=ベース名(ファイル);/ /获取文件名字
     $ file_extension = strtolower(substrは(strrchrの($ファイル名、 "。")、1));/ /获取文件扩展名 

     / /根据扩展名指出输出浏览器格式
    スイッチ($ file_extension){
        ケース "EXE":$ CTYPE = "application / octet-streamを";休憩;
        場合は "zip":$ CTYPE = "アプリケーション/ ZIP";休憩;
        ケース "MP3":$ CTYPE = "オーディオ/ mpeg";休憩;
        ケース "MPG":$ CTYPE = "video / mpegの";休憩;
        場合 "AVI":$ CTYPE = "ビデオ/ x-msvideo";休憩;
        デフォルト:$ CTYPE = "アプリケーション/強制的にダウンロードする";
     } 

     / /ヘッダの書き込みを開始
    ヘッダ( "のCache-Control:");
    ヘッダ( "のCache-Control:public"に); 

     / /设置输出浏览器格式
    ヘッダ( "のContent-Type:$ ctype関数");
     IF(strstr($ _SERVER ['HTTP_USER_AGENT']、 "MSIE")){/ /如果是IEが浏览器
        ファイル名に複数のピリオド/複数のドットを持つIEのファイル名のバグに対する回避策#
        例えば、 - #そのファイル名に角括弧が追加されます。  setup.abc.exe [1]。abc.exeセットアップになります
         $ iefilename =するpreg_replace( '/ \ /'、 '%2eを'、$ filenameに、substr_count($ファイル名) -  1 '。');
        ヘッダ( "のContent-Disposition:添付ファイル、ファイル名= \" $ iefilename \ "");
    する} else {
        ヘッダ( "のContent-Disposition:添付ファイル、ファイル名= \" $ファイル名\ "");
     }
    ヘッダ( "のAccept-レンジ:バイト"); 

     $サイズ=ファイルサイズ($ファイル);
     / /如果有$ _SERVER ['HTTP_RANGE']参数
     IF(かどうかの判断($ _SERVER ['HTTP_RANGE'])){
 / * ---------------------------
   範囲头域レンジ头域可以请求实体的一个或者多个子范围例如、表示头500个字节:バイト数= 0から499まで表示第二个500字节:バイト= 500から999まで表示最后500个字节:バイト= -500表示500字节以后的范围:バイト= 500  - 第一个和最后一个字节:バイト= 0-0、-1同时指定几个范围:バイト= 500-600,601-999  (OK)。
    --------------------------- * / 

 / /断点后再次连接$ _SERVER ['HTTP_RANGE']的值バイト= 4390912  -  

        リスト($、$範囲)=爆発する( "="、$ _SERVER ['HTTP_RANGE']);
    / / yesの場合、欠落部分をダウンロード
         str_replaceを($範囲、 " - "、ドルの範囲);/ /这句干什么的呢。。
    $ size2のサイズ= $ 1 ;/ /文件总字节数
         $ new_length = $ size2の、ドルの範囲;/ /获取下次下载的长度
        ヘッダ( "HTTP/1.1 206部分的コンテンツ");
        ヘッダ( "Content-Lengthが:$ new_length");/ /输入总长
        ヘッダ( "コンテンツ範囲:バイトドルの範囲$ size2の/ $サイズ");/ /コンテンツ範囲:バイト4908618-4988927/4988928 95パーセント的时候
    する} else {/ /第一次连接
         $ = $ size2のサイズ -  1;
        ヘッダ( "コンテンツ範囲:バイト0  -  $ size2の/ $サイズ"); / /コンテンツ·レンジ:バイト0-4988927/4988928
        ヘッダ( "Content-Lengthを" $サイズ);/ /输出总长
     }
     / /打开文件
    コー​​ル$ fp = fopen( "$ FILE"、 "RB");
     / /设置指针位置
     fseek関数($ fpは、ドルの範囲);
     / /虚幻输出
    中(!はfeof($ fpが)){
         / /设置文件最长执行时间
         set_time_limit(0);
        印刷(ファイルのfread($ fpは、1024 * 8));/ /输出文件
         flush()を;/ /输出缓冲
        するob_flush();
     }
    注fclose($ fp)は、
    終了します;
 } 

 dl_file_resume( "1.ZIP");/ /同级目录的1.zipを文件 

 / / ---------------------------------------
 / /不支持断点续传的文件下载。
 / / ---------------------------------------

 downFile( "1.zipを"); 

機能downFile($ sFilePath)
 {
    {(調べるfile_exists($ sFilePath))の場合
        $ aFilePath =爆発する( "/"、str_replaceを( "\ \"、 "/"、$ sFilePath)、$ sFilePath);
        $ファイルsfilename = $ aFilePath [カウント($ aFilePath)-1];
        $ nFileSize =ファイルサイズ($ sFilePath);
       ヘッダ( "のContent-Disposition:添付ファイル、ファイル名=" $ sfilenameファイル);
       ヘッダ( "Content-Lengthを" $ nFileSize);
       ヘッダ( "コンテンツタイプ:application / octet-stream"という。)
        ReadFile関数($ sFilePath);
    }
   
    {
       エコー( "文件不存在!");
    }
 }
 ?>
この記事を共有する:
ブックマーク Googleブックマーク reddit Mixxは StumbleUponの Technoratiの ヤフーバズ DesignFloat おいしい viewビュー 畳む

"PHP断点续传HTTP学习笔记"への応答なし

応答を残しなさい:

名前(必須):
メール(公開されません)(必須):
ウェブサイト:
コメント(必須):
XHTML:これらのタグを使用することができます。 <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>