Search code examples
javascriptphpapachehttpx-sendfile

HTTP File Download: Monitoring Download Progress


I am in a situation, when I have to implement downloading of large files(up to 4GB) from a Web server: Apache 2.4.4 via HTTP protocol. I have tried several approaches, but the best solution looks to be the usage of X-SendFile module.

As I offer progress bar for file uploads, I would need to have the same feature for file downloads. So here are my questions:

  • Is there any way, including workaround, to achieve file downloads progress monitoring?
  • Is there any way, including workaround, to calculate file download transfer speed?
  • Is there better way to provide efficient file downloads from a web server than usage of X-Sendfile module?

Is there better file download option in general, that would allow me to monitor file download progress? It can be a client (JavaScript) or server solution(PHP). Is there any particular web server that allows this?

Currently I use:

  • Apache 2.4.4
  • Ubuntu

Many times thanks.


Solution

  • 2 ideas (not verified):

    First:

    Instead of placing regular links to files (that you want to download) on your page place links like .../dowanload.php which may look sth like this:

    <?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);
    ?>
    

    This way you may keep eye on your download process. In the meantime you may write progress info to the DB/session var and update progress bar reading status from DB/session var using AJAX of course polling a script that reads progress info.

    That is very simplified but I think it might work as you want.

    Second:

    Apache 2.4 has Lua language built in:

    I bet you can try to write LUA Apache handler that will monitor your download - send progress to the DB and update progress bar using PHP/AJAX taking progress info from the DB.

    Similarly - there are modules for perl and even python (but not for win)