【问题标题】:Increment download w/ support for download manager支持下载管理器的增量下载
【发布时间】:2015-02-11 16:10:46
【问题描述】:

我需要允许下载文件,但必须跟踪每个用户下载文件的次数。

我在这里有一段简单的代码,允许用户下载文件,然后回调在完成后为该用户增加数据存储区中的计数器。

如果用户不使用下载管理器,这可以正常工作。但如果它们是(即:DownThemAll),那么管理器会发出多个 HTTP 请求,并且每次都会调用回调。这会增加下载次数并使其不可靠。 我尝试通过观察会话变量来短路多个请求 - 从理论上讲,这会将多个请求减少到一个。但似乎 DownThemAll 没有跨请求共享同一个会话,所以它不起作用。

有没有办法让它工作?

    return \Response::stream(function() use ($stream, $file, $callback) {
        while (!feof($stream)) {
            echo fread($stream, 1024);
        }
        fclose($stream);
        Log::info('Resource downloaded', ['resource' => $file]);
        if (is_callable($callback)) {
            call_user_func($callback);
        }
    }, 200, $headers);

【问题讨论】:

    标签: php laravel download download-manager


    【解决方案1】:

    您可以尝试使用令牌系统,仅根据消耗的令牌增加下载量。

    有一个控制器方法可以生成一个令牌来下载文件。这个令牌生成是增加下载计数器的原因。接下来,有一个接收令牌的方法,将其标记为已使用(因此此令牌不会发生其他请求/增量),然后启动传输。您可以在传输之前或在文件末尾标记令牌,无论哪种方式,但如果您在此之前这样做,那么下载管理员将无权下载资源。

    下载系统的此请求令牌还有助于防止直接链接到资源。

    如果您想要一个带有计数器的开放式下载系统,那么我建议使用标头和浏览器信息记录所有 http 请求,然后将多个 http 请求按 ip/header 分组在一个分配的窗口中作为一个计数。 HTTP_USER_AGENT 和 REMOTE_ADDR/HTTP_X_REAL_IP 可能是您团购所需的全部,但我不确定。

    【讨论】:

      【解决方案2】:

      我能够通过根据下载大小监控处理程序位置来使其工作。看来这行得通。

              return \Response::stream(function() use ($stream, $size, $file, $callback) {
                  while (!feof($stream)) {
                      echo fread($stream, 1024);
                  }   
      
                  //  Only log downloaded and increment counter when the EOF
                  //  of the stream is ACTUALLY reached. This continues to allow
                  //  individual downloads to work, but also allows download
                  //  managers to send concurrent requests and only increment
                  //  when the whole file is sent.
                  if (ftell($stream) == $size) {
                      Log::info('Resource downloaded', ['resource' => $file]);
                      if (is_callable($callback)) {
                          call_user_func($callback);
                      }
                  }
                  fclose($stream);
              }, 200, $headers);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 2016-01-06
        • 2017-10-05
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        相关资源
        最近更新 更多