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); } 他 { エコー( "文件不存在!"); } } ?>
