2016-02-21 36 views
0

我试图获取一些客户端信息并将每个下载文件请求存储在数据库中。存储所需的所有信息后,下载请求正在处理:在数据库中存储唯一的下载请求

return response()->download($file_path); 

的问题是,对每个请求,主要是通过下载管理器,多连接到相同的URL做出这样的应用程序商店上的同一请求多行用户。

我想限制每个唯一客户端请求的存储不是每个连接。我想防止多重连接会为我做的,所以我加了Accept-Ranges头:

return response()->download($file_path, null, ["Accept-Ranges" => "None"]); 

虽然下载没有恢复,能了,多行存储在数据库中。 (但它比以前少得多)

避免在用户下载请求中插入多个数据库的最佳做法是什么?

*请不要接听或没有考虑到多个重复和同时请求从多个独特的和同时请求不同意见。否则,那里有很多解决方案。

P.S.我不想用Laravel来标记我的问题。请不要添加它。

+2

开始可以给每个下载一个唯一的ID,这将是在URL中可见,并且这将在一定时间到期。所以只要下载恢复使用该ID,你可以认为它是相同的下载。虽然在发送文件的最后一个范围时,您必须注意是否过期链接。这只是一个意见。 – frz3993

+0

我认为这不是一个好的做法。您可能会错过唯一的下载请求,因为您不知道该密钥的过期时间,也许有人会尝试在该特定时间内多次下载文件。 @ frz3993 – revo

+0

您是否在插入数据库之前尝试过检查'Range'头值?对于新的/唯一的下载请求,它不应该出现或从0开始。 – max

回答

0

你试过插入到数据库之前检查Range头值?

对于新的/独特的下载请求时,它不应该被提交或从0

+0

太快了! (y) – revo

+0

只是一个巧合:) – max

+0

我喜欢这种巧合 – revo

0

要了解唯一身份用户,您需要身份验证系统。但我看到你无法使用认证系统。

没有任何绝对的方法来做到这一点。用户可以更改IP地址,删除或更改cookie等,因为一切都在他们手中。

你仍然可以插入的ip,HTTP_USER_AGENT数据库,也可以提高质量,您可以设置一些饼干识别唯一的用户。

此外,您可以使用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添加行指定它的状态。每当有新的下载文件请求到来时,您都会检查该用户和请求的文件的状态。如果记录存在,那么你将不允许用户下载文件。

+0

如何存储用户的IP地址和用户代理可以导致找到唯一的请求?在发送下载请求之前,用户也被认证。这就是为什么我需要一些关于他们的下载请求的信息。 – revo

+0

那么,为什么你不能使用会话来确定下载请求呢? –

+0

使用会话我们如何跟踪唯一的下载请求?当前用户在下载时是否可以向同一文件发送另一个下载请求?如果是,那么应该如何实现会话以识别导致在数据库中仅存储2行的差异? – revo

0

您可以尝试存储用户代理,并检查与evry请求如果用户代理相同,但用户可能会尝试通过不同的浏览器/下载管理器同时下载,因此没有充分的证据。 但 既然你在你所不支持/允许用户恢复下载的问题已经提到.. 因此,用户已经开始下载他可能会尝试通过不同的浏览器下载,但用户IP地址的可能性后得到改变是非常少的...... 所以你可以存储用户browsr代理+用户IP地址,并与每个请求检查它们是否同您的数据库进行新的条目之前.. 这可能不是100%的证据,但即时猜测你的问题将会得到解决!

相关问题