1

我还在等待答案。

我需要查看此时是否有人正在下载特定文件。最初的问题:我想知道何时有人中断下载文件。

服务器配置:

server 
{

    listen 80;
    server_name mysite.com;

    location /ugp/
    {
        alias /www/ugp/;
    }
    break;
}

用户可以从http://mysite.com/ugp/下载文件,例如http://mysite.com/ugp/1.mp3

更新

如何分析access.log并不那么明显。有些浏览器在用户停止下载(谷歌浏览器)时会发送 206 代码,有些则不会(HTC 播放器、移动应用程序):

85.145.8.243 - - [18/Jan/2013:16:08:41 +0300] "GET /ugp/6.mp3 HTTP/1.1" 200 10292776 "-" "HTC Streaming Player htc_wwe / 1.0 / htc_ace / 2.3.5"
85.145.8.243 - - [18/Jan/2013:16:08:41 +0300] "GET /ugp/2.mp3 HTTP/1.1" 200 697216 "-" "HTC Streaming Player htc_wwe / 1.0 / htc_ace / 2.3.5"
85.145.8.243 - - [18/Jan/2013:16:09:44 +0300] "GET /ugp/7.mp3 HTTP/1.1" 200 4587605 "-" "HTC Streaming Player htc_wwe / 1.0 / htc_ace / 2.3.5"
4

2 回答 2

1

为了提供更大的灵活性,您可以添加 PHP 服务器,并发布 URL,例如

  http://mysite.com/download.php?file=2.mp3

从它的download.php位置(例如)读取文件/var/www/files/2.mp3,有一个建议的代码。(标题

<?php

  // Here you know precisely that a download is requested

  $path = '/home/var/www/files';
  $file = "$path/" . $_GET['file']; // check user input!
  $size = filesize($file);
  $read = 0;

  $state = 'downloading ' . $file;

  // echo headers for a binary file download 

  @ $f = fopen ($file, 'r');
  if ( $f ) {
    // Output 100 bytes in each iteration
    while (($chunk = fread($f, 100)) !== false) {
      // specify somewhere $state, still downloading
      echo $chunk;
      $read += strlen($chunk);
    }
    fclose ($f);
  }
  if ($read >= $size) 
    $state = 'done';
  else
    $state = 'fail';
?>

这是一个提供算法的例子——根本没有经过测试!但应该与下载代码非常接近(通常使用readfile,但它会一次性读取文件)

于 2013-01-18T13:51:08.330 回答
0

看看 nginx扩展状态模块

于 2013-01-18T13:07:08.187 回答