}
//Begin writing headers
header("Cache-Control:");
header("Cache-Control: public");
//
设置输出浏览器格式
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=" .
$outFile
);
header("Accept-Ranges: bytes");
$size
=
filesize
(
$sourceFile
);
//如果有$_SERVER['HTTP_RANGE']
参数
if
(isset (
$_SERVER
['HTTP_RANGE'])) {
/*Range
头域 Range
头域可以请求实体的一个或者多个子范围。
例如,
表示头 500 个字节:bytes=0-499
表示第二个 500 字节:bytes=500-999
表示最后 500 个字节:bytes=-500
表示 500 字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件 GET 包含 Range 请求头,响应会以状态码
206(PartialContent)返回而不是以 200 (OK
)。
*/
//
断点后再次连接 $_SERVER['HTTP_RANGE']
的值 bytes=4390912-
list (
$a
,
$range
) =
explode
("=",
$_SERVER
['HTTP_RANGE']);
//if yes, download missing part
str_replace
(
$range
, "-",
$range
);
//
这句干什么的呢。。。。
$size2
=
$size
-1;
//
文件总字节数
$new_length
=
$size2
-
$range
;
//
获取下次下载的长度
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $new_length");
//
输入总长
header("Content-Range: bytes $range$size2/$size");
//Content-Range: bytes 4908618-
4988927/4988928 95%
的时候
}
else
{
//
第一次连接
$size2
=
$size
-1;
header("Content-Range: bytes 0-$size2/$size");
//Content-Range: bytes 0-4988927/4988928
header("Content-Length: " .
$size
);
//
输出总长
}
//
打开文件
$fp
=
fopen
("$sourceFile", "rb");
//
设置指针位置
fseek
(
$fp
,
$range
);