[英]HTTP File Download: Monitoring Download Progress
当我必须从Web服务器下载大文件(最多4GB)时,我处于这种情况:Apache 2.4.4通过HTTP协议。 我尝试了几种方法,但最好的解决方案是使用X-SendFile模块。
当我提供文件上传的进度条时,我需要具有相同的文件下载功能。 所以这是我的问题:
是否有更好的文件下载选项,这将允许我监视文件下载进度? 它可以是客户端(JavaScript)或服务器解决方案(PHP)。 是否有任何特定的Web服务器允许这样做?
目前我使用:
很多时候谢谢。
2个想法(未经验证):
第一:
而不是在您的页面上放置文件(您想要下载)的常规链接,而不是像... / dowanload.php那样看起来像这样的链接:
<?php
// download.php file
session_start(); // if needed
$filename = $_GET['filename']);
header( 'Content-type: text/plain' ); // use any MIME you want here
header( 'Content-Disposition: attachment; filename="' . htmlspecialchars($filename) . '"' );
header( 'Pragma: no-cache' );
// of course add some error handling
$filename = 'c:/php/php.ini';
$handle = fopen($filename, 'rb');
// do not use file_get_contents as you've said files are up to 4GB - so read in chunks
while($chunk = fread($handle, 1000)) // chunk size may depend on your filesize
{
echo $chunk;
flush();
// write progress info to the DB, or session variable in order to update progress bar
}
fclose($handle);
?>
这样您就可以继续关注下载过程。 在此期间,您可以将进度信息写入DB / session var并使用AJAX从DB / session var更新进度条读取状态,当然轮询读取进度信息的脚本。
这是非常简化的,但我认为它可能会按你的意愿工作。
第二:
Apache 2.4内置了Lua语言:
我打赌你可以尝试编写LUA Apache处理程序来监控你的下载 - 将进度发送到数据库并使用PHP / AJAX从数据库中获取进度信息来更新进度条。
同样 - 有perl和甚至python的模块(但不是win)
我看到主要问题:在php + apache解决方案输出缓冲可能放在几个地方:
浏览器<= 1 => Apache <= 2 => PHP处理程序<= 3 => PHP解释程序进程
你需要控制第一个缓冲区。 但直接来自PHP是不可能的。
可能的解决方案:
1)您可以编写自己的迷你守护进程,其主要功能仅发送文件,并在80端口8880以外的其他地方运行。 并从那里处理下载文件和监视输出缓冲区。 您的输出缓冲区只有一个,您可以控制它:
浏览器<= 1 => PHP解释器进程
2)你也可以直接从apache获取mod_lua和控制输出缓冲区。
3)你也可以使用内置的perl来获取nginx并控制nginx输出缓冲区(它是稳定的)
4)尝试使用PHP内置的Web服务器并直接控制php输出缓冲区。 抱歉,我不能说它是如何稳定的。 但你可以试试。 ;)
我认为nginx + php +内置perl是更稳定和强大的解决方案。 但您可以选择并可能在该列表中使用其他解决方案。 我会关注这个主题并感兴趣地等待你的最终解决方案。
以较短的间隔读写数据库会破坏性能。
我建议使用会话(增加循环中发送数据的值),你可以通过另一个php文件安全地关闭它,你可以返回数据作为JSON,可以由javascript函数/插件使用。
如果你使用php版本> = 5.4那么这可以帮助你http://www.php.net/manual/en/session.upload-progress.php
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.