【问题标题】:PHP download file: show progress in browserPHP下载文件:在浏览器中显示进度
【发布时间】:2014-11-18 07:15:57
【问题描述】:

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

我使用以下代码给用户一个文件:

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 这样的下载系统。单击任何链接时,会立即出现保存/打开对话框。之后就可以在浏览器中看到下载进度了。

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

【问题讨论】:

  • 我正在使用 Chrome,但我在相关网站上看不到关于下载的任何特别之处。没有任何东西可以发送,以使浏览器显示某种不错的下载进度条。我认为这里的问题或多或少是您的计算机,仅此而已。
  • @N.B.我不明白为什么我的网站在您点击链接并看到“保存文件”对话框的那一刻之间存在时间间隔?我相信代码有问题。看起来浏览器会等到整个文件将在显示对话框窗口之前传输的那一刻。
  • 我在使用 firefox 时遇到了问题,它在通知我它正在启动之前下载了整个文件。我怀疑它与标头有什么关系(它不可能 - 没有意义),它要么与您的计算机有关(硬盘分区已满或只是慢/旧硬盘有问题)或 firefox 的下载机制(再次,不知道它,因为我用的不多)。

标签: php progress-bar download


【解决方案1】:

我使用下面的代码,在 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

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 2019-08-26
    • 1970-01-01
    • 2022-12-30
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2018-12-05
    相关资源
    最近更新 更多