2015-02-11 41 views
2

我需要允許下載文件,但必須跟蹤每個用戶下載的次數。增量下載w /支持下載管理器

我在這裏有一個簡單的代碼塊,允許用戶下載文件,然後當該用戶完成時,該回調會增加數據存儲區中的計數器。

如果用戶不使用下載管理器,這工作正常。但是,如果它們是(即: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); 

回答

0

您可以嘗試一個令牌系統,並只根據消耗的令牌增加下載量。

有一個控制器方法來生成令牌來下載文件。這個令牌生成是遞增下載計數器的。接下來,有一種方法接收令牌,將其標記爲已消耗(因此此令牌不會發生其他請求/增量),然後啓動傳輸。您可以在傳輸前或文件結束時標記令牌,但是如果您之前執行此操作,那麼下載管理器將無權訪問下載資源。

此下載系統的請求令牌還有助於防止直接鏈接到資源。

如果你想要一個帶有計數器的開放式下載系統,那麼我建議使用頭部和瀏覽器信息記錄所有http請求,然後通過ip/header將多個http請求分組到一個計數中。 HTTP_USER_AGENT和REMOTE_ADDR/HTTP_X_REAL_IP可能是你需要團購的所有東西,但我不確定。

0

我能夠通過監視處理程序位置與下載大小來獲得此工作。看起來這是有效的。

 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);