文件下载实际完成时的触发操作

时间:2012-04-15 14:35:53

标签: php

现在有很多网站用于托管文件(uploading websites),并且例如每个完整下载某个文件的点数。

我的问题 我想了解他们使用的是什么想法!

如何 仅依靠 完整 下载文件? 我的意思是如果我 取消了文件的下载 ,它就不会算上点了! 怎么知道的!是否有任何PHP功能,能够知道我是否取消下载某些确切的文件!

这个问题一直存在于我的脑海中并且在思考它,但我无法理解它是如何运作的,或者它背后的想法是什么。 〜谢谢

1 个答案:

答案 0 :(得分:1)

这可以通过使用我的其他答案作为基础How can I give download access to files outside public_html directory?并替换readfile( $filename )来完成 与readfileWhileConnected( $filename )

读取文件直到EOF或断开连接:

/** 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;
    }
}

准备好新的class myNewSuperDownloadHandlerClass { ... }后,请确保只通过filedownload.php描述的myNewSuperDownloadHandlerClass()提供下载,或者如果做得好readfileWhileConnected(),请使用,只需确保return false; return true; return null; return false; return true;用于每次需要连接状态轮询的下载。

如果用户关闭连接,您可以轻松添加要触发的回调,此处只有2个退出点。 (看过许多经常{{1}}等等的函数......)