我有一个图片上传表单,可以上传大量(可能是数百万)的记录。像用户的个人资料图片,目前我们正在给出命名为
'some_constant_string'.time().[image_file_extension];
,例如 'tcs'.time().'jpg';
这是一种正确的方法,还是会产生一些重复的问题。请帮助正确的方法!
目前使用PHP 5.6与Codeigniter Framework 3.0
答案 0 :(得分:1)
这不是正确的做法。如果两个用户同时触发上传事件,他们都会有1234.jpg,导致至少有一个混淆的用户。
对于唯一名称,有uniqid()
。这将解决您当前的问题。
但是, 还有另一个(IMO更好)解决方案 :使用正确的dirnames ,例如/uploads/user_id/some-image.jpg
。这将为您带来更多优势
至少,重复的文件名(几乎)是不可能的。您现在还可以更有效地使用scandir()
等函数,因为您无需检查大量图像。如果您删除用户,只需删除/uploads/user_id/
即可轻松删除所有图片。
答案 1 :(得分:1)
如果你希望很多文件是uploades,我会稍微改变一下。
我会将命名更改为以下内容:
<user_id> . '_' .microtime(true) . <img_extension>
然后,重复图像的问题会更少,因为同一用户的两个图像应该在同一个微秒内处理。如果您认为自己仍然可能遇到问题,可以试试这个:
<user_id> . '_' . microtime(true) . '_' . <inc> . <img_extension>
这里的值可能是soee中的一个计数器,用于重命名图像的循环或db id中的自动增量字段,需要集中处理。
另一个人认为你应该注意的是如何存储所有图像。把所有这些都放在同一个文件夹中是一个坏主意,所以在寻找名称时我会建议创建一个forder结构,例如:
你有这个档案:
123_1498116500_1.jpg
您可以拆分为这样的文件夹结构:
/123/149/811/650/123_1498116500_1.jpg
使用这种结构,当操作系统管理具有数千个文件的文件夹时,您将避免一些开销。
希望有所帮助:)
答案 2 :(得分:0)
由于time()
(显然)具有一秒钟的分辨率,因此您需要将图像处理限制为每秒一次。但是平均每天只有86,400秒 - 只需要数学。
uniqid()应该是更好的选择 - 不要忘记启用$more_entropy
参数。
答案 3 :(得分:0)
图像的重复是可能的,但只有当2个或更多用户同时上传图像时才会发生。
您可以使用MD5(或其他内容)来唯一标识您的图片,或使用类似uniqid()