search
HomeBackend DevelopmentPHP TutorialPHP 关于文件下传上载 断点续传有关问题

PHP 关于文件上传下载 断点续传问题

PHP 关于文件上传下载 断点续传问题

让PHP下载代码支持断点续传 主要靠的 HTTP协议中header? Content-Range来实现

先来说说 HTTP的下载原理

对于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可:

GET /Path/FileName HTTP/1.0
Host:?www.server.com:80
Accept: **表示接收任何类型的数据。User-Agent表示用户代理,这个字段可有可无,但强烈建议加上,因为它是服务器统计、追踪以及识别客户端的依据。Connection字段中的close表示使用非持久连接。

关于HTTP协议更多的细节可以参考RFC2616(HTTP 1.1)。因为我只是想通过HTTP协议实现文件下载,所以也只看了一部分,并没有看全。

如果服务器成功收到该请求,并且没有出现任何错误,则会返回类似下面的数据:

HTTP/1.0 200 OK
Content-Length: 13057672
Content-Type: application/octet-stream
Last-Modified: Wed, 10 Oct 2005 00:56:34 GMT
Accept-Ranges: bytes
ETag: "2f38a6cac7cec51:160c"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 16 Nov 2005 01:57:54 GMT
Connection: close

下面来解释下这些返回信息的含义

第一行是协议名称及版本号,空格后面会有一个三位数的数字,是HTTP协议的响应状态码,200表示成功,OK是对状态码的简短文字描述。状态码共有5类:
1xx属于通知类;
2xx属于成功类;
3xx属于重定向类;
4xx属于客户端错误类;
5xx属于服务端错误类。


对 于状态码,相信大家对404应该很熟悉,如果向一个服务器请求一个不存在的文件,就会得到该错误,通常浏览器也会显示类似“HTTP 404 - 未找到文件”这样的错误。Content-Length字段是一个比较重要的字段,它标明了服务器返回数据的长度,这个长度是不包含HTTP头长度的。换句话说,我们的请求中并没有Range字段(后面会说到),表示我们请求的是整个文件,所以Content-Length就是整个文件的大小。其余各字段是一些关于文件和服务器的属性信息。

以上就是通过HTTP协议实现文件下载的全过程。但还不能实现断点续传,而实际上断点续传的实现非常简单,只要在请求中加一个Range字段就可以了。

假如一个文件有1000个字节,那么其范围就是0-999,则:

Range: bytes=500-??????表示读取该文件的500-999字节,共500字节。
Range: bytes=500-599???表示读取该文件的500-599字节,共100字节。
Range还有其它几种写法,但上面这两种是最常用的,对于断点续传也足矣了。如果HTTP请求中包含Range字段,那么服务器会返回206(Partial Content),同时HTTP头中也会有一个相应的Content-Range字段,类似下面的格式:
Content-Range: bytes 500-999/1000
Content-Range字段说明服务器返回了文件的某个范围及文件的总长度。这时Content-Length字段就不是整个文件的大小了,而是对应文件这个范围的字节数,这一点一定要注意。

下面来看PHP对断点续传支持的演示:

先定义一个函数? getRange() 这个函数用来处理? header中 Range 具体数据的处理

复制代码
<p><span   style="max-width:90%"> 1</span> <span style="line-height: 1.5; color: #008000;">/*</span><span style="line-height: 1.5; color: #008000;">* $file_size  文件大小 </span><span style="line-height: 1.5; color: #008000;">*/</span><span style="line-height: 1.5;"></span><span style="line-height: 1.5; color: #008080;"> 2</span> <span style="line-height: 1.5;">?</span><span style="line-height: 1.5; color: #0000ff;">function</span><span style="line-height: 1.5;"> getRange(</span><span style="line-height: 1.5; color: #800080;">$file_size</span><span style="line-height: 1.5;">){</span><span style="line-height: 1.5; color: #008080;"> 3</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #0000ff;">isset</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$_SERVER</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">HTTP_RANGE</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">])</span><span style="line-height: 1.5;">?</span><span style="line-height: 1.5; color: #800080;">$_SERVER</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">HTTP_RANGE</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">]</span><span style="line-height: 1.5;">:</span><span style="line-height: 1.5; color: #0000ff;">null</span><span style="line-height: 1.5;">;</span><span style="line-height: 1.5; color: #008080;"> 4</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #0000ff;">if</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">!</span><span style="line-height: 1.5; color: #0000ff;">empty</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">)){</span><span style="line-height: 1.5; color: #008080;"> 5</span> <span style="line-height: 1.5;">        </span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #008080;">preg_replace</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">/[\s|,].*/</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">''</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;"> 6</span> <span style="line-height: 1.5;">        </span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #008080;">explode</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">-</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5; color: #008080;">substr</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;">6</span><span style="line-height: 1.5;">));</span><span style="line-height: 1.5; color: #008080;"> 7</span> <span style="line-height: 1.5;">        </span><span style="line-height: 1.5; color: #0000ff;">if</span><span style="line-height: 1.5;"> (</span><span style="line-height: 1.5; color: #008080;">count</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">) </span><span style="line-height: 1.5;"><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">2</span><span style="line-height: 1.5;"> ) {</span><span style="line-height: 1.5; color: #008080;"> 8</span> <span style="line-height: 1.5;">            </span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">1</span><span style="line-height: 1.5;">] </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #800080;">$file_size</span><span style="line-height: 1.5;">;</span><span style="line-height: 1.5; color: #008080;"> 9</span> <span style="line-height: 1.5;">        }</span><span style="line-height: 1.5; color: #008080;">10</span> <span style="line-height: 1.5;">        </span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #008080;">array_combine</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #0000ff;">array</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">start</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">end</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">)</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;">11</span> <span style="line-height: 1.5;">        </span><span style="line-height: 1.5; color: #0000ff;">if</span><span style="line-height: 1.5;"> (</span><span style="line-height: 1.5; color: #0000ff;">empty</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">start</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">])) {</span><span style="line-height: 1.5; color: #008080;">12</span> <span style="line-height: 1.5;">            </span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">start</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">] </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">0</span><span style="line-height: 1.5;">;</span><span style="line-height: 1.5; color: #008080;">13</span> <span style="line-height: 1.5;">        }</span><span style="line-height: 1.5; color: #008080;">14</span> <span style="line-height: 1.5;">        </span><span style="line-height: 1.5; color: #0000ff;">if</span><span style="line-height: 1.5;"> (</span><span style="line-height: 1.5;">!</span><span style="line-height: 1.5; color: #0000ff;">isset</span><span style="line-height: 1.5;"> (</span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">end</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">]) </span><span style="line-height: 1.5;">||</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #0000ff;">empty</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">end</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">])) {</span><span style="line-height: 1.5; color: #008080;">15</span> <span style="line-height: 1.5;">            </span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">end</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">] </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #800080;">$file_size</span><span style="line-height: 1.5;">;</span><span style="line-height: 1.5; color: #008080;">16</span> <span style="line-height: 1.5;">        }</span><span style="line-height: 1.5; color: #008080;">17</span> <span style="line-height: 1.5;">        </span><span style="line-height: 1.5; color: #0000ff;">return</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #800080;">$range</span><span style="line-height: 1.5;">;</span><span style="line-height: 1.5; color: #008080;">18</span> <span style="line-height: 1.5;">    }</span><span style="line-height: 1.5; color: #008080;">19</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #0000ff;">return</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #0000ff;">null</span><span style="line-height: 1.5;">;</span><span style="line-height: 1.5; color: #008080;">20</span> <span style="line-height: 1.5;">}</span></span></p>
复制代码

假设文件的地址为 $file_path

复制代码
<p><span   style="max-width:90%"> 1</span> <span style="line-height: 1.5; color: #800080;">$speed</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">512</span><span style="line-height: 1.5;">;</span><span style="line-height: 1.5; color: #008000;">//</span><span style="line-height: 1.5; color: #008000;">此参数为下载最大速度</span><span style="line-height: 1.5; color: #008000;"></span><span style="line-height: 1.5; color: #008080;"> 2</span> <span style="line-height: 1.5; color: #008000;">?</span><span style="line-height: 1.5; color: #800080;">$pos</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #008080;">strrpos</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$file_path</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">"</span><span style="line-height: 1.5;">/</span><span style="line-height: 1.5;">"</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;"> 3</span> <span style="line-height: 1.5;">?</span><span style="line-height: 1.5; color: #800080;">$file_name</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #008080;">substr</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$file_path</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #800080;">$pos</span><span style="line-height: 1.5;">+</span><span style="line-height: 1.5;">1</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;"> 4</span> <span style="line-height: 1.5; color: #800080;">$file_size</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #008080;">filesize</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$file_path</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;"> 5</span> <span style="line-height: 1.5; color: #800080;">$ranges</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;"> getRange(</span><span style="line-height: 1.5; color: #800080;">$file_size</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;"> 6</span> <span style="line-height: 1.5; color: #800080;">$fh</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">  </span><span style="line-height: 1.5; color: #008080;">fopen</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$file_path</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">"</span><span style="line-height: 1.5;">rb</span><span style="line-height: 1.5;">"</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;"> 7</span> <span style="line-height: 1.5; color: #008080;">header</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">Cache-control: public</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;"> 8</span> <span style="line-height: 1.5; color: #008080;">header</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">Content-Type: application/octet-stream</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;"> 9</span> <span style="line-height: 1.5; color: #008080;">header</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">Content-Disposition: attachment; filename=</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">.</span><span style="line-height: 1.5; color: #800080;">$file_name</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;">10</span> <span style="line-height: 1.5; color: #0000ff;">if</span><span style="line-height: 1.5;"> (</span><span style="line-height: 1.5; color: #800080;">$ranges</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">!=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #0000ff;">null</span><span style="line-height: 1.5;">) {</span><span style="line-height: 1.5; color: #008080;">11</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #008080;">header</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">HTTP/1.1 206 Partial Content</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;">12</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #008080;">header</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">Accept-Ranges: bytes</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;">13</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #008080;">header</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #008080;">sprintf</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">Content-Length: %u</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5; color: #800080;">$ranges</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">end</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">] </span><span style="line-height: 1.5;">-</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #800080;">$ranges</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">start</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">]));</span><span style="line-height: 1.5; color: #008080;">14</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #008080;">header</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #008080;">sprintf</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">Content-Range: bytes %s-%s/%s</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #800080;">$ranges</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">start</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">]</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #800080;">$ranges</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">end</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">]</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #800080;">$file_size</span><span style="line-height: 1.5;">));</span><span style="line-height: 1.5; color: #008080;">15</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #008080;">fseek</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$fh</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #008080;">sprintf</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">%u</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5; color: #800080;">$ranges</span><span style="line-height: 1.5;">[</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">start</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">]));</span><span style="line-height: 1.5; color: #008080;">16</span> <span style="line-height: 1.5;">}</span><span style="line-height: 1.5; color: #0000ff;">else</span><span style="line-height: 1.5;">{</span><span style="line-height: 1.5; color: #008080;">17</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #008080;">header</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">"</span><span style="line-height: 1.5;">HTTP/1.1 200 OK</span><span style="line-height: 1.5;">"</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;">18</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #008080;">header</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #008080;">sprintf</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">Content-Length: %s</span><span style="line-height: 1.5;">'</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #800080;">$file_size</span><span style="line-height: 1.5;">));</span><span style="line-height: 1.5; color: #008080;">19</span> <span style="line-height: 1.5;">}</span><span style="line-height: 1.5; color: #008080;">20</span> <span style="line-height: 1.5; color: #0000ff;">while</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">!</span><span style="line-height: 1.5; color: #008080;">feof</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$fh</span><span style="line-height: 1.5;">))</span><span style="line-height: 1.5; color: #008080;">21</span> <span style="line-height: 1.5;">{</span><span style="line-height: 1.5; color: #008080;">22</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #0000ff;">echo</span><span style="line-height: 1.5;">  </span><span style="line-height: 1.5; color: #008080;">fread</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$fh</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #008080;">round</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$speed</span><span style="line-height: 1.5;">*</span><span style="line-height: 1.5;">1024</span><span style="line-height: 1.5;">,</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">0</span><span style="line-height: 1.5;">));</span><span style="line-height: 1.5; color: #008080;">23</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #008080;">ob_flush</span><span style="line-height: 1.5;">();</span><span style="line-height: 1.5; color: #008080;">24</span> <span style="line-height: 1.5;">    </span><span style="line-height: 1.5; color: #008080;">sleep</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5;">1</span><span style="line-height: 1.5;">);</span><span style="line-height: 1.5; color: #008080;">25</span> <span style="line-height: 1.5;">}</span><span style="line-height: 1.5; color: #008080;">26</span> <span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$fh</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">!=</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #0000ff;">null</span><span style="line-height: 1.5;">) </span><span style="line-height: 1.5;">&&</span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5; color: #008080;">fclose</span><span style="line-height: 1.5;">(</span><span style="line-height: 1.5; color: #800080;">$fh</span><span style="line-height: 1.5;">);</span></p>
复制代码

基本如此 就可以解决一般性文件的断点续传或者下载了

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Springboot怎么使用内置tomcat禁止不安全HTTPSpringboot怎么使用内置tomcat禁止不安全HTTPMay 12, 2023 am 11:49 AM

Springboot内置tomcat禁止不安全HTTP方法1、在tomcat的web.xml中可以配置如下内容让tomcat禁止不安全的HTTP方法/*PUTDELETEHEADOPTIONSTRACEBASIC2、Springboot使用内置tomcat没有web.xml配置文件,可以通过以下配置进行,简单来说就是要注入到Spring容器中@ConfigurationpublicclassTomcatConfig{@BeanpublicEmbeddedServletContainerFacto

JAVA发送HTTP请求的方式有哪些JAVA发送HTTP请求的方式有哪些Apr 15, 2023 am 09:04 AM

1.HttpURLConnection使用JDK原生提供的net,无需其他jar包,代码如下:importcom.alibaba.fastjson.JSON;importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.net.HttpURLConnection;

nginx中如何升级到支持HTTP2.0nginx中如何升级到支持HTTP2.0May 24, 2023 pm 10:58 PM

一、前言#ssl写在443端口后面。这样http和https的链接都可以用listen443sslhttp2default_server;server_namechat.chengxinsong.cn;#hsts的合理使用,max-age表明hsts在浏览器中的缓存时间,includesubdomainscam参数指定应该在所有子域上启用hsts,preload参数表示预加载,通过strict-transport-security:max-age=0将缓存设置为0可以撤销hstsadd_head

Nginx中HTTP的keepalive怎么配置Nginx中HTTP的keepalive怎么配置May 12, 2023 am 11:28 AM

httpkeepalive在http早期,每个http请求都要求打开一个tpcsocket连接,并且使用一次之后就断开这个tcp连接。使用keep-alive可以改善这种状态,即在一次tcp连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少time_wait状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。但是,keep-ali

Python的HTTP客户端模块urllib与urllib3怎么使用Python的HTTP客户端模块urllib与urllib3怎么使用May 20, 2023 pm 07:58 PM

一、urllib概述:urllib是Python中请求url连接的官方标准库,就是你安装了python,这个库就已经可以直接使用了,基本上涵盖了基础的网络请求功能。在Python2中主要为urllib和urllib2,在Python3中整合成了urllib。Python3.x中将urllib2合并到了urllib,之后此包分成了以下四个模块:urllib.request:它是最基本的http请求模块,用来模拟发送请求urllib.error:异常处理模块,如果出现错误可以捕获这些异常urllib

Nginx http运行状况健康检查如何配置Nginx http运行状况健康检查如何配置May 14, 2023 pm 06:10 PM

被动检查对于被动健康检查,nginx和nginxplus会在事件发生时对其进行监控,并尝试恢复失败的连接。如果仍然无法恢复正常,nginx开源版和nginxplus会将服务器标记为不可用,并暂时停止向其发送请求,直到它再次标记为活动状态。上游服务器标记为不可用的条件是为每个上游服务器定义的,其中包含块中server指令的参数upstream:fail_timeout-设置服务器标记为不可用时必须进行多次失败尝试的时间,以及服务器标记为不可用的时间(默认为10秒)。max_fails-设置在fai

面试官问:一个TCP连接可以发多少个HTTP请求?面试官问:一个TCP连接可以发多少个HTTP请求?Feb 22, 2023 pm 12:00 PM

曾经有这么一道经典面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么?相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?

PHP返回数组所有值,组成一个数组PHP返回数组所有值,组成一个数组Mar 21, 2024 am 09:06 AM

这篇文章将为大家详细讲解有关PHP返回数组所有值,组成一个数组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用array_values()函数array_values()函数返回一个数组中所有值的数组。它不会保留原始数组的键。$array=["foo"=>"bar","baz"=>"qux"];$values=array_values($array);//$values将是["bar","qux"]使用循环可以使用循环手动获取数组的所有值并将其添加到一个新

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft