我需要允许下载文件,但必须跟踪每个用户下载文件的次数。
我这里有一个简单的代码块,允许用户下载文件,然后在完成后,回调会为该用户的数据存储区中的计数器递增。
如果用户不使用下载管理器,则此工作正常。但如果它们是(即: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 :(得分:0)
您可以尝试使用令牌系统,只根据使用的令牌增加下载量。
使用控制器方法生成令牌以下载文件。此令牌生成是下载计数器的增量。接下来,有一个方法接收令牌,将其标记为已消耗(因此此令牌不会发生其他请求/增量),然后启动传输。您可以在传输之前或文件结束时标记令牌,但如果您之前执行此操作,则下载管理员将无权下载资源。
此下载系统的请求令牌也有助于防止直接链接到资源。
如果你想要一个带有计数器的开放式下载系统,那么我建议用头和浏览器信息记录所有的http请求,然后通过ip / header将分配的窗口中的多个http请求分组为一个计数。 HTTP_USER_AGENT和REMOTE_ADDR / HTTP_X_REAL_IP可能是团购所需的全部,但我不确定。
答案 1 :(得分: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);