我正在尝试获取一些客户端信息并将每个下载文件请求存储在数据库中。存储所有需要的信息后,正在处理下载请求:
return response()->download($file_path);
问题在于,每个请求(主要是下载管理器)都会对同一个URL建立许多连接,因此应用程序会在用户的同一请求中存储多行。
我想限制每个唯一客户端请求的存储,而不是每个连接。我想防止多个连接会为我做,所以我添加了Accept-Ranges
标题:
return response()->download($file_path, null, ["Accept-Ranges" => "None"]);
虽然下载不再可恢复,但多行存储在数据库中。 (但它比以前少得多)
避免在用户下载请求中插入多个数据库的最佳做法是什么?
*如果不考虑多个重复和同步请求与多个唯一且同时请求不同,请不要回答或评论。否则有很多解决方案。
P.S。我不想用Laravel标记我的问题。请不要添加它。
答案 0 :(得分:0)
要了解唯一身份用户,您需要身份验证系统。但我发现你无法使用身份验证系统。
没有任何绝对的方法可以做到这一点。用户可以更改IP地址,删除或更改cookie等,因为一切都在他们手中。
您仍然可以将 ip,http_user_agent 插入数据库,并且为了提高质量,您可以设置一些 Cookie 来识别唯一身份用户。
此外,您可以使用PHP Sessions - 用于用户管理系统。
session_start();
$id = session_id();
检查当前会话用户。如果已经有相同用户的下载请求则更新请求,如果没有创建请求。
<强>更新强>
如果您根据评论使用会话和身份验证,则在下载请求到来时存储:
+----+---------+---------+-------------+-----------------+-----------------+
| id | user_id | file_id | status | created_at | updated_at |
+----+---------+---------+-------------+-----------------+-----------------+
| 1 | 1 | 1 | in_progress | 1456477761.9624 | 1456477762.9624 |
+----+---------+---------+-------------+-----------------+-----------------+
当经过身份验证的用户请求下载特定文件时,请在DB中添加指定其状态的行。每当下载文件的新请求到来时,您将检查该用户的状态和所请求的文件。如果记录存在,那么您将不允许用户下载文件。
答案 1 :(得分:0)
如果用户代理与用户相同,您可以尝试存储用户代理并检查evry请求,可以尝试同时通过不同的浏览器/下载管理器下载,因此不能完全证明.. 但 由于您在问题中提到您不支持/允许用户恢复下载。 因此,在用户开始下载后,他可能会尝试通过不同的浏览器下载,但用户ip地址变更的可能性非常小...... 因此,您可以存储用户浏览器代理+用户IP地址,并在数据库中创建新条目之前检查每个请求是否相同。 这可能不是100%证明,但我猜测你的问题将在一定程度上得到解决!
答案 2 :(得分:0)
您是否尝试在插入数据库之前检查Range
标头值?
对于新/唯一下载请求,不应显示或从0开始。