企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
# 文件断点续传 ## 文件断点续传 HTTP Header里的Range和Content-Range参数 http协议从1.1开始支持获取文件的部分内容,这为并行下载以及断点续传提供了技术支持。它通过在Header里两个参数实现的,客户端发请求时对应的是`Range`,服务器端响应时对应的是`Content-Range`;通过tomcat看一下这两个参数。一般断点下载时才用到 Range 和 Content-Range 实体头。 **Range** 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:Range:(unit=first byte pos)-\[last byte pos\] 如:'Range: bytes=0-2000' **Content-Range** 用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式: Content-Range: bytes (unit first byte pos) - \[last byte pos\]/\[entity legth\] 如:Content-Range: bytes 0-2000/4932 文件断点续传 请求下载整个文件的请求头: ``` <pre class="calibre10">``` GET <span class="token1">/</span>test<span class="token3">.</span>rar HTTP<span class="token1">/</span><span class="token6">1.1</span> Connection<span class="token3">:</span> close Host<span class="token3">:</span> <span class="token6">116.1</span><span class="token6">.219</span><span class="token6">.219</span> Range<span class="token3">:</span> bytes<span class="token1">=</span><span class="token6">0</span><span class="token1">-</span><span class="token6">801</span> <span class="token">//一般请求下载整个文件是bytes=0- 或不用这个头</span> ``` ``` 一般正常回应的响应头 ``` <pre class="calibre10">``` HTTP<span class="token1">/</span><span class="token6">1.1</span> <span class="token6">200</span> OK Content<span class="token1">-</span>Length<span class="token3">:</span> <span class="token6">801</span> Content<span class="token1">-</span>Type<span class="token3">:</span> application<span class="token1">/</span>octet<span class="token1">-</span>stream Content<span class="token1">-</span>Range<span class="token3">:</span> bytes <span class="token6">0</span><span class="token1">-</span><span class="token6">800</span><span class="token1">/</span><span class="token6">801</span> <span class="token">//801:文件总大小</span> ``` ``` 例子: ``` <pre class="calibre10">``` <span class="token1"><</span><span class="token1">?</span>php <span class="token5">function</span> <span class="token4">download</span><span class="token3">(</span>$path<span class="token3">,</span>$file<span class="token3">)</span><span class="token3">{</span> $real <span class="token1">=</span> $path<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$file<span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token1">!</span><span class="token4">file_exists</span><span class="token3">(</span>$real<span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> <span class="token6">false</span><span class="token3">;</span> <span class="token3">}</span> $size <span class="token1">=</span> <span class="token4">filesize</span><span class="token3">(</span>$real<span class="token3">)</span><span class="token3">;</span><span class="token">//取得文件大小 </span> $size2 <span class="token1">=</span> $size<span class="token1">-</span><span class="token6">1</span><span class="token3">;</span><span class="token">//?? </span> $range <span class="token1">=</span> <span class="token6">0</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">isset</span><span class="token3">(</span>$_SERVER<span class="token3">[</span><span class="token2">'HTTP_RANGE'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span><span class="token">//http_range:表示请求一个实体/文件的一个部分 </span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'HTTP /1.1 206 Partial Content'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//返回部分请求成功给浏览器 </span> $range <span class="token1">=</span> <span class="token4">str_replace</span><span class="token3">(</span><span class="token2">'='</span><span class="token3">,</span><span class="token2">'-'</span><span class="token3">,</span>$_SERVER<span class="token3">[</span><span class="token2">'HTTP_RANGE'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> $range <span class="token1">=</span> <span class="token4">explode</span><span class="token3">(</span><span class="token2">'-'</span><span class="token3">,</span>$range<span class="token3">)</span><span class="token3">;</span> $range <span class="token1">=</span> <span class="token4">trim</span><span class="token3">(</span>$range<span class="token3">[</span><span class="token6">1</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'Content-Length:'</span><span class="token3">.</span>$size<span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'Content-Range: bytes '</span><span class="token3">.</span>$range<span class="token3">.</span><span class="token2">'-'</span><span class="token3">.</span>$size2<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$size<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token3">{</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'Content-Length:'</span><span class="token3">.</span>$size<span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'Content-Range: bytes 0-'</span><span class="token3">.</span>$size2<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$size<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'Accenpt-Ranges: bytes'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'application/octet-stream'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">"Cache-control: public"</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">"Pragma: public"</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//解决在IE中下载时中文乱码问题 </span> $ua <span class="token1">=</span> $_SERVER<span class="token3">[</span><span class="token2">'HTTP_USER_AGENT'</span><span class="token3">]</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">preg_match</span><span class="token3">(</span><span class="token2">'/MSIE/'</span><span class="token3">,</span>$ua<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> $ie_filename <span class="token1">=</span> <span class="token4">str_replace</span><span class="token3">(</span><span class="token2">'+'</span><span class="token3">,</span><span class="token2">'%20'</span><span class="token3">,</span><span class="token4">urlencode</span><span class="token3">(</span>$file<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'Content-Dispositon:attachment; filename='</span><span class="token3">.</span>$ie_filename<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token3">{</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'Content-Dispositon:attachment; filename='</span><span class="token3">.</span>$file<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> $fp <span class="token1">=</span> <span class="token4">fopen</span><span class="token3">(</span>$real<span class="token3">,</span><span class="token2">'rb+'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">fseek</span><span class="token3">(</span>$fp<span class="token3">,</span>$range<span class="token3">)</span><span class="token3">;</span> <span class="token5">while</span><span class="token3">(</span><span class="token1">!</span><span class="token4">feof</span><span class="token3">(</span>$fp<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token4">set_time_limit</span><span class="token3">(</span><span class="token6">0</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">print</span><span class="token3">(</span><span class="token4">fread</span><span class="token3">(</span>$fp<span class="token3">,</span><span class="token6">1024</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">flush</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">ob_flush</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token4">fclose</span><span class="token3">(</span>$fp<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> ``` ``` 例子2: FileDownload.class.php ``` <pre class="calibre10">``` class <span class="token4">FileDownload</span><span class="token3">{</span> <span class="token">// class start </span> private $_speed <span class="token1">=</span> <span class="token6">512</span><span class="token3">;</span> <span class="token">// 下载速度 </span> <span class="token">/** 下载 * @param String $file 要下载的文件路径 * @param String $name 文件名称,为空则与下载的文件名称一样 * @param boolean $reload 是否开启断点续传 */</span> public <span class="token5">function</span> <span class="token4">download</span><span class="token3">(</span>$file<span class="token3">,</span> $name<span class="token1">=</span><span class="token2">''</span><span class="token3">,</span> $reload<span class="token1">=</span><span class="token6">false</span><span class="token3">)</span><span class="token3">{</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">file_exists</span><span class="token3">(</span>$file<span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> <span class="token5">if</span><span class="token3">(</span>$name<span class="token1">==</span><span class="token2">''</span><span class="token3">)</span><span class="token3">{</span> $name <span class="token1">=</span> <span class="token4">basename</span><span class="token3">(</span>$file<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> $fp <span class="token1">=</span> <span class="token4">fopen</span><span class="token3">(</span>$file<span class="token3">,</span> <span class="token2">'rb'</span><span class="token3">)</span><span class="token3">;</span> $file_size <span class="token1">=</span> <span class="token4">filesize</span><span class="token3">(</span>$file<span class="token3">)</span><span class="token3">;</span> $ranges <span class="token1">=</span> $this<span class="token1">-</span><span class="token1">></span><span class="token4">getRange</span><span class="token3">(</span>$file_size<span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'cache-control:public'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'content-type:application/octet-stream'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'content-disposition:attachment; filename='</span><span class="token3">.</span>$name<span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span>$reload <span class="token1">&&</span> $ranges<span class="token1">!=</span><span class="token5">null</span><span class="token3">)</span><span class="token3">{</span> <span class="token">// 使用续传 </span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'HTTP/1.1 206 Partial Content'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'Accept-Ranges:bytes'</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 剩余长度 </span> <span class="token4">header</span><span class="token3">(</span><span class="token4">sprintf</span><span class="token3">(</span><span class="token2">'content-length:%u'</span><span class="token3">,</span>$ranges<span class="token3">[</span><span class="token2">'end'</span><span class="token3">]</span><span class="token1">-</span>$ranges<span class="token3">[</span><span class="token2">'start'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// range信息 </span> <span class="token4">header</span><span class="token3">(</span><span class="token4">sprintf</span><span class="token3">(</span><span class="token2">'content-range:bytes %s-%s/%s'</span><span class="token3">,</span> $ranges<span class="token3">[</span><span class="token2">'start'</span><span class="token3">]</span><span class="token3">,</span> $ranges<span class="token3">[</span><span class="token2">'end'</span><span class="token3">]</span><span class="token3">,</span> $file_size<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// fp指针跳到断点位置 </span> <span class="token4">fseek</span><span class="token3">(</span>$fp<span class="token3">,</span> <span class="token4">sprintf</span><span class="token3">(</span><span class="token2">'%u'</span><span class="token3">,</span> $ranges<span class="token3">[</span><span class="token2">'start'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'HTTP/1.1 200 OK'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'content-length:'</span><span class="token3">.</span>$file_size<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">while</span><span class="token3">(</span><span class="token1">!</span><span class="token4">feof</span><span class="token3">(</span>$fp<span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> echo <span class="token4">fread</span><span class="token3">(</span>$fp<span class="token3">,</span> <span class="token4">round</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>_speed<span class="token1">*</span><span class="token6">1024</span><span class="token3">,</span><span class="token6">0</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">ob_flush</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//sleep(1); // 用于测试,减慢下载速度 </span> <span class="token3">}</span> <span class="token3">(</span>$fp<span class="token1">!=</span><span class="token5">null</span><span class="token3">)</span> <span class="token1">&&</span> <span class="token4">fclose</span><span class="token3">(</span>$fp<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> <span class="token5">return</span> <span class="token2">''</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">/** 设置下载速度 * @param int $speed */</span> public <span class="token5">function</span> <span class="token4">setSpeed</span><span class="token3">(</span>$speed<span class="token3">)</span><span class="token3">{</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">is_numeric</span><span class="token3">(</span>$speed<span class="token3">)</span> <span class="token1">&&</span> $speed<span class="token1">></span><span class="token6">16</span> <span class="token1">&&</span> $speed<span class="token1"><</span><span class="token6">4096</span><span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>_speed <span class="token1">=</span> $speed<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">/** 获取header range信息 * @param int $file_size 文件大小 * @return Array */</span> private <span class="token5">function</span> <span class="token4">getRange</span><span class="token3">(</span>$file_size<span class="token3">)</span><span class="token3">{</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">isset</span><span class="token3">(</span>$_SERVER<span class="token3">[</span><span class="token2">'HTTP_RANGE'</span><span class="token3">]</span><span class="token3">)</span> <span class="token1">&&</span> <span class="token1">!</span><span class="token4">empty</span><span class="token3">(</span>$_SERVER<span class="token3">[</span><span class="token2">'HTTP_RANGE'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> $range <span class="token1">=</span> $_SERVER<span class="token3">[</span><span class="token2">'HTTP_RANGE'</span><span class="token3">]</span><span class="token3">;</span> $range <span class="token1">=</span> <span class="token4">preg_replace</span><span class="token3">(</span><span class="token2">'/[\s|,].*/'</span><span class="token3">,</span> <span class="token2">''</span><span class="token3">,</span> $range<span class="token3">)</span><span class="token3">;</span> $range <span class="token1">=</span> <span class="token4">explode</span><span class="token3">(</span><span class="token2">'-'</span><span class="token3">,</span> <span class="token4">substr</span><span class="token3">(</span>$range<span class="token3">,</span> <span class="token6">6</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">count</span><span class="token3">(</span>$range<span class="token3">)</span><span class="token1"><</span><span class="token6">2</span><span class="token3">)</span><span class="token3">{</span> $range<span class="token3">[</span><span class="token6">1</span><span class="token3">]</span> <span class="token1">=</span> $file_size<span class="token3">;</span> <span class="token3">}</span> $range <span class="token1">=</span> <span class="token4">array_combine</span><span class="token3">(</span><span class="token4">array</span><span class="token3">(</span><span class="token2">'start'</span><span class="token3">,</span><span class="token2">'end'</span><span class="token3">)</span><span class="token3">,</span> $range<span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">empty</span><span class="token3">(</span>$range<span class="token3">[</span><span class="token2">'start'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> $range<span class="token3">[</span><span class="token2">'start'</span><span class="token3">]</span> <span class="token1">=</span> <span class="token6">0</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">empty</span><span class="token3">(</span>$range<span class="token3">[</span><span class="token2">'end'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> $range<span class="token3">[</span><span class="token2">'end'</span><span class="token3">]</span> <span class="token1">=</span> $file_size<span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> $range<span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> <span class="token5">null</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">// class end </span> ``` ``` demo ``` <pre class="calibre10">``` <span class="token4">require</span><span class="token3">(</span><span class="token2">'FileDownload.class.php'</span><span class="token3">)</span><span class="token3">;</span> $file <span class="token1">=</span> <span class="token2">'book.zip'</span><span class="token3">;</span> $name <span class="token1">=</span> <span class="token4">time</span><span class="token3">(</span><span class="token3">)</span><span class="token3">.</span><span class="token2">'.zip'</span><span class="token3">;</span> $obj <span class="token1">=</span> <span class="token5">new</span> <span class="token4">FileDownload</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $flag <span class="token1">=</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">download</span><span class="token3">(</span>$file<span class="token3">,</span> $name<span class="token3">)</span><span class="token3">;</span> <span class="token">//$flag = $obj->download($file, $name, true); // 断点续传 </span> <span class="token5">if</span><span class="token3">(</span><span class="token1">!</span>$flag<span class="token3">)</span><span class="token3">{</span> echo <span class="token2">'file not exists'</span><span class="token3">;</span> <span class="token3">}</span> ``` ``` 例子2测试: 文件断点续传 在demo.php开启断点续传 ``` <pre class="calibre10">``` $flag <span class="token1">=</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">download</span><span class="token3">(</span>$file<span class="token3">,</span> $name<span class="token3">,</span> <span class="token6">true</span><span class="token3">)</span><span class="token3">;</span> ``` ``` linux的cli命令请求demo.php ``` <pre class="calibre17">``` fdipzone@ubuntu<span class="token3">:</span><span class="token1">~</span><span class="token1">/</span>Downloads$ wget <span class="token1">-</span>O test<span class="token3">.</span>rar http<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>demo<span class="token3">.</span>fdipzone<span class="token3">.</span>com<span class="token1">/</span>demo<span class="token3">.</span>php <span class="token1">--</span><span class="token6">2013</span><span class="token1">-</span><span class="token6">06</span><span class="token1">-</span><span class="token6">30</span> <span class="token6">16</span><span class="token3">:</span><span class="token6">53</span><span class="token3">:</span><span class="token6">19</span><span class="token1">--</span> http<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>demo<span class="token3">.</span>fdipzone<span class="token3">.</span>com<span class="token1">/</span>demo<span class="token3">.</span>php 正在解析主机 demo<span class="token3">.</span>fdipzone<span class="token3">.</span>com<span class="token3">.</span><span class="token3">.</span><span class="token3">.</span> <span class="token6">127.0</span><span class="token6">.0</span><span class="token6">.1</span> 正在连接 demo<span class="token3">.</span>fdipzone<span class="token3">.</span>com<span class="token1">|</span><span class="token6">127.0</span><span class="token6">.0</span><span class="token6">.1</span><span class="token1">|</span><span class="token3">:</span><span class="token6">80.</span><span class="token3">.</span><span class="token3">.</span> 已连接。 已发出 HTTP 请求,正在等待回应<span class="token3">.</span><span class="token3">.</span><span class="token3">.</span> <span class="token6">200</span> OK 长度: <span class="token6">10445120</span> <span class="token3">(</span><span class="token6">10.0</span>M<span class="token3">)</span> <span class="token3">[</span>application<span class="token1">/</span>octet<span class="token1">-</span>stream<span class="token3">]</span> 正在保存至<span class="token3">:</span> “test<span class="token3">.</span>rar” <span class="token6">20</span><span class="token1">%</span> <span class="token3">[</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">></span> <span class="token3">]</span> <span class="token6">2</span><span class="token3">,</span><span class="token6">097</span><span class="token3">,</span><span class="token6">720</span> <span class="token6">516</span>K<span class="token1">/</span>s 估时 <span class="token6">16</span>s <span class="token1">^</span>C fdipzone@ubuntu<span class="token3">:</span><span class="token1">~</span><span class="token1">/</span>Downloads$ wget <span class="token1">-</span>c <span class="token1">-</span>O test<span class="token3">.</span>rar http<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>demo<span class="token3">.</span>fdipzone<span class="token3">.</span>com<span class="token1">/</span>demo<span class="token3">.</span>php <span class="token1">--</span><span class="token6">2013</span><span class="token1">-</span><span class="token6">06</span><span class="token1">-</span><span class="token6">30</span> <span class="token6">16</span><span class="token3">:</span><span class="token6">53</span><span class="token3">:</span><span class="token6">31</span><span class="token1">--</span> http<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>demo<span class="token3">.</span>fdipzone<span class="token3">.</span>com<span class="token1">/</span>demo<span class="token3">.</span>php 正在解析主机 demo<span class="token3">.</span>fdipzone<span class="token3">.</span>com<span class="token3">.</span><span class="token3">.</span><span class="token3">.</span> <span class="token6">127.0</span><span class="token6">.0</span><span class="token6">.1</span> 正在连接 demo<span class="token3">.</span>fdipzone<span class="token3">.</span>com<span class="token1">|</span><span class="token6">127.0</span><span class="token6">.0</span><span class="token6">.1</span><span class="token1">|</span><span class="token3">:</span><span class="token6">80.</span><span class="token3">.</span><span class="token3">.</span> 已连接。 已发出 HTTP 请求,正在等待回应<span class="token3">.</span><span class="token3">.</span><span class="token3">.</span> <span class="token6">206</span> Partial Content 长度: <span class="token6">10445121</span> <span class="token3">(</span><span class="token6">10.0</span>M<span class="token3">)</span>,<span class="token6">7822971</span> <span class="token3">(</span><span class="token6">7.5</span>M<span class="token3">)</span> 字节剩余 <span class="token3">[</span>application<span class="token1">/</span>octet<span class="token1">-</span>stream<span class="token3">]</span> 正在保存至<span class="token3">:</span> “test<span class="token3">.</span>rar” <span class="token6">100</span><span class="token1">%</span><span class="token3">[</span><span class="token1">++</span><span class="token1">++</span><span class="token1">++</span><span class="token1">++</span><span class="token1">++</span><span class="token1">++</span><span class="token1">++</span><span class="token1">++</span><span class="token1">++</span><span class="token1">++</span><span class="token1">++</span><span class="token1">++</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">===</span><span class="token1">=</span><span class="token1">></span><span class="token3">]</span> <span class="token6">10</span><span class="token3">,</span><span class="token6">445</span><span class="token3">,</span><span class="token6">121</span> <span class="token6">543</span>K<span class="token1">/</span>s 花时 <span class="token6">14</span>s <span class="token6">2013</span><span class="token1">-</span><span class="token6">06</span><span class="token1">-</span><span class="token6">30</span> <span class="token6">16</span><span class="token3">:</span><span class="token6">53</span><span class="token3">:</span><span class="token6">45</span> <span class="token3">(</span><span class="token6">543</span> KB<span class="token1">/</span>s<span class="token3">)</span> <span class="token1">-</span> 已保存 “test<span class="token3">.</span>rar” <span class="token3">[</span><span class="token6">10445121</span><span class="token1">/</span><span class="token6">10445121</span><span class="token3">]</span><span class="token3">)</span> 可以看到会从断点的位置<span class="token3">(</span><span class="token1">%</span><span class="token6">20</span><span class="token3">)</span>开始下载。 ``` ```