分块文件是PHP中最快/最简单的方法,如果你不能或不想使用更专业的东西,如cURL,Apache上的mod-xsendfile
或一些专用脚本。
$filename = $filePath.$filename;
$chunksize = 5 * (1024 * 1024); //5 MB (= 5 242 880 bytes) per one chunk of file.
if(file_exists($filename))
{
set_time_limit(300);
$size = intval(sprintf("%u", filesize($filename)));
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.$size);
header('Content-Disposition: attachment;filename="'.basename($filename).'"');
if($size > $chunksize)
{
$handle = fopen($filename, 'rb');
while (!feof($handle))
{
print(@fread($handle, $chunksize));
ob_flush();
flush();
}
fclose($handle);
}
else readfile($path);
exit;
}
else echo 'File "'.$filename.'" does not exist!';
从 richnetapps.com/ NeedBee移植。在 200 MB 的文件中进行了测试,这些文件已失效,即使允许的最大内存限制设置为 ,也比下载的文件大小大五倍。readfile()
1G
顺便说一句:我也在文件上测试了这一点,但是PHP只设法首先写入文件,然后断开了连接。与文件相关的函数(fopen、fread、fseek)使用 INT,因此您最终达到了 .上面提到的解决方案(即)似乎是在这种情况下唯一的选择。>2GB
2GB
2GB
mod-xsendfile
编辑:让自己100%的文件保存在utf-8
中。如果省略它,下载的文件将损坏。这是因为此解决方案使用打印
将文件块推送到浏览器。