繁体   English   中英

HTTP文件下载:监控下载进度

[英]HTTP File Download: Monitoring Download Progress

当我必须从Web服务器下载大文件(最多4GB)时,我处于这种情况:Apache 2.4.4通过HTTP协议。 我尝试了几种方法,但最好的解决方案是使用X-SendFile模块。

当我提供文件上传的进度条时,我需要具有相同的文件下载功能。 所以这是我的问题:

  • 有没有办法,包括解决方法,来实现文件下载进度监控?
  • 有没有办法,包括解决方法,来计算文件下载传输速度?
  • 有没有比使用X-Sendfile模块更好的方法从Web服务器提供有效的文件下载?

是否有更好的文件下载选项,这将允许我监视文件下载进度? 它可以是客户端(JavaScript)或服务器解决方案(PHP)。 是否有任何特定的Web服务器允许这样做?

目前我使用:

  • Apache 2.4.4
  • Ubuntu的

很多时候谢谢。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM