我怎么知道我的文件真正下载了多少次?

时间:2017-12-10 20:54:36

标签: php nginx

任务是创建一个控制器来计算文件下载次数。它还必须能够解决失败或取消的下载。我想知道是否有人知道实现这一目标的最佳方式。

$file = $_GET['download'];
if (ob_get_level()) {
    ob_end_clean();
}
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
return filesize($file);`

    $size = filesize($file);

然后,如果给定的字节数大约等于文件大小:

    if ( $size < given bytes) {
    $handle = fopen("counter.txt", "r");
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        $buffer=$buffer+1;
    }
    fclose($handle);
    $fp = fopen("counter.txt", "w"); 
    $test = fwrite( $fp, $buffer); 
    fclose($fp);
}

如何知道服务器在点击链接后发送给用户的字节数?

1 个答案:

答案 0 :(得分:1)

我将从应该发表的评论开始:

  • 您已将此标记为javascript,但您的问题似乎与javascript无关。请不要这样做。

  • 我假设您了解脚本暴露的安全漏洞/您并不关心它。

  • 您对输出缓冲的处理是错误的。

  

return filesize($ file);

  • 这行代码应该是什么?
  

标题('过期:0');

  • 没有
  

标题('Pragma:public');

  • 再次,没有。

关于你的问题 - 全部涵盖in the manual

<?php
ignore_user_abort(1);

$file = $_GET['download'];
if (!is_readable($file)) {
   die "No such file";
}
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Cache-Control: max-age=0; must-revalidate');
header('Content-Length: ' . filesize($file));

$count=0;
$ih=fopen($file, 'r');
while (CONNECTION_NORMAL==connection_status() && !feof($ih)) {
    print fgets($ih, 4096);
} 
log_completion(feof($ih));

顺便说一句:如果文件被下载,这不会给出准确的记录 - 你只能告诉内容是否已经离开了PHP。