Trigger action when file download actually completes

前端 未结 1 1857
天涯浪人
天涯浪人 2021-02-11 02:47

Nowdays there are a lot of websites for files hosting (uploading websites) and it count for example point per complete download of certain file.

My

相关标签:
1条回答
  • 2021-02-11 03:00

    This can be done by using my other answer as base How can I give download access to files outside public_html directory? and replacing readfile( $filename )
    with readfileWhileConnected( $filename ):

    Read file until EOF or disconnect:

    /** Read $filename until EOF or disconnect, 
     * if disconnect then error_log() count of bytes read already 
     */
    function readfileWhileConnected( $filename ) {
        // Save and set ini values:
        $user_abort = ignore_user_abort();
        ignore_user_abort(false);
        // Get file size and set bytes_sent to zero:
        $fsize = filesize($filename);
        $bytes_sent = 0;
        // Open file:
        $f = fopen($filename, 'r');
        // Read file:
        while($chunk = fread($f, 1024)) {
            // Check if connection is still open:
            if(!connection_aborted()) {
                // Send $chunk to buffer (if any), then flush() buffers:
                echo $chunk;
                flush();
                // Add $chunk length to $bytes_sent
                $bytes_sent += strlen($chunk);
            } else {
                // Close file:
                fclose($f);
                error_log("Connection closed at $bytes_sent/$fsize");
                exit();
            }
        // Close file:
        fclose($f);
        // Reset ini values:
        ignore_user_abort($user_abort);
        return $bytes_sent;
        }
    }
    

    After you have your new shiny class myNewSuperDownloadHandlerClass { ... } ready, then make sure you only serve downloads through filedownload.php described here or if have done good myNewSuperDownloadHandlerClass(), then use that, just make sure that readfileWhileConnected() is used for every download requiring connection status polling.

    You can easily add callback to be triggered if user closes connection, only 2 exit points here. (seen many functions that have every often return false; return true; return null; return false; return true; and so on..)

    0 讨论(0)
提交回复
热议问题