如何检查PHP下载是否被取消?

时间:2018-04-26 01:02:19

标签: php download

我需要记录特定文件的总下载量。下载功能工作正常,但无法定义用户是否取消(在浏览器对话框中单击“取消”)或后面的连接中止。
我知道知道文件下载何时完成并不简单,所以我试图通过两种方式来解决这个问题。无效:

  1. 获取发送的总字节数,后者我将它与总文件大小进行比较:这样$ bytes_sent var总是设置为总文件大小,无论用户单击下载对话框的取消按钮还是取消下载过程。
  2. 触发connection_aborted()函数:未找到此函数发生的方式并定义我的会话var ...
  3. (如果我与会议合作的事实是相关的,我不会感到害羞)。

    感谢您的帮助:)。

    <?php
    if(is_file($filepath)){
        $handle = fopen($filepath, "r");
    
        header("Content-Type: $mime_type");
        header("Content-Length: ". filesize($filepath).";");
        header("Content-disposition: attachment; filename=" . $name);
    
        while(!feof($handle)){
            ignore_user_abort(true);
            set_time_limit(0);
            $data = fread($handle, filesize($filepath));
            print $data;
            $_SESSION['download'] = 'Successful download';
            //Always is set as total file lenght, even when cancel a large file download before it finish:
            bytes_sent = ftell($handle);
            flush();
            ob_flush();
            //Can't trigger connection aborted, in any case:
            if(connection_aborted()){
                $_SESSION['download'] = 'Canceled download';
            }
        }
    } 
    

    PHP Version 5.3.29

1 个答案:

答案 0 :(得分:1)

您需要以小块读取文件,而不是一次性读取所有文件。

$chunk_size = 1000;
ignore_user_abort();
$canceled = false;
while ($chunk = fread($handle, $chunk_size)) {
    print $chunk;
    ob_flush();
    $bytes_sent += strlen($chunk);
    if (connection_aborted()) {
        $canceled = true;
        break;
    }
}
$_SESSION['download'] = $canceled ? "Download canceled" : "Download successful";