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

Bun*_*ori 5 javascript php apache http x-sendfile

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

由于我为文件上传提供进度条,因此我需要为文件下载提供相同的功能。这是我的问题:

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

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

目前我使用:

  • 阿帕奇2.4.4
  • 乌班图

多次感谢。

Art*_*tur 4

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);
?>
Run Code Online (Sandbox Code Playgroud)

这样您就可以关注您的下载过程。同时,您可以将进度信息写入 DB/session var,并使用 AJAX 更新 DB/session var 中的进度条读取状态,当然还可以轮询读取进度信息的脚本。

这是非常简单的,但我认为它可能会如你所愿。

第二:

Apache 2.4内置了Lua语言:

我打赌您可以尝试编写 LUA Apache 处理程序来监视您的下载 - 将进度发送到数据库并使用 PHP/AJAX 从数据库获取进度信息来更新进度栏。

同样 - 有用于 perl 甚至 python 的模块(但不用于 win)