PHP下载文件:在浏览器中显示进度

时间:2014-09-23 22:56:22

标签: php progress-bar download

我网站上的用户可以下载文件。有时这些文件非常大,我希望用户在浏览器中看到下载进度条。

我使用以下代码为用户提供文件:

header('Content-Type: text/xml');
header('Content-Disposition: attachment; filename='.$fileName);
header('Pragma: no-cache');
header('Content-Transfer-Encoding: binary');
header('Pragma: public');
header('Content-Length: '.filesize($fullFileName));
header("Content-Description: File Transfer");

$fileHandler = fopen($fullFileName, 'r');
while(!feof($fileHandler)){
    echo fread($fileHandler, 2048);
}
fclose($fileHandler);

当我运行此脚本浏览器(FireFox)冻结一段时间后,我可以看到加载颜色圈,并且只有在保存/打开对话框文件出现后。当我点击"保存"按钮,文件几乎立即下载到我的电脑(文件很大 - 50 Mb)。

我想在此site上下载系统。单击任何链接时,会立即显示save / opean对话框。然后,您可以在浏览器中看到下载进度。

是否有任何特殊标题可以在浏览器中显示进度条?我该如何更改代码?

1 个答案:

答案 0 :(得分:0)

我使用下面的代码,在Firefox中它确实给了我下载时间和进度:

// send headers first
header('Content-type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-disposition: attachment; filename='.$FileName);
header("Content-Length: ".filesize($Path));
// then use an easy way to flush and end all output buffers
while (@ob_end_flush());
// flush file
readfile($Path);

如果正确指定Content-Length,它应该有效。我在代码中发现的唯一有点奇怪的是Content-Type: text/xml标题。请注意,我使用Content-type: application/octet-stream