命名用户头像的最有效方法是什么?

6
我想让我的用户在个人资料中上传头像。我的第一个想法是将头像文件命名为[user_id].jpg。这样即使用户更新其头像,它仍然保持相同的名称。
问题在于,如果我在服务器上使用缓存(甚至在客户端使用缓存),新的头像就不会显示出来。
我的新解决方案是将文件命名为:
[user_id]_[random_number].jpg
并将随机数存储在Users表中。您如何以最有效的方式生成此数字?或者也许有更好的解决方案?

我假设 user_id 是一个数字? - Grzegorz Gierlik
@ Grzegorz:是的,用户表的实际id。现在我看到人们建议不公开显示此ID。 - Max
4个回答

7
当用户上传新头像时,您应该能够使缓存失效。
如果不可能的话,您可以将其存储为[uid]_[YYYYMMDDhhmmss].jpg或其他格式。没有必要生成任何随机值...

1
除非您想要将“uid”隐藏起来,以免其他用户可能会利用某人的uid。 - Jorge Guberte
3
可以的。OP可能只需使用uniqid()函数生成一个文件名,然后将当前的头像文件名存储在用户模型中。 - Christian Wattengård
@Jorge:我在我的应用程序中公开使用$userId,这样做有什么原因需要隐藏它吗?如果我在SO上点击您的个人资料,我会在URL中得到一个ID:313194。这不是您的用户ID吗?还是说这是另一个字段? - Max

5
我会这样做:

我会这样做:

$avatarName = $userId . uniqid();
// add extension if needed, store it

它将快速执行您想要的操作。uniqid()

编辑

正如其他用户建议的那样,您应该从图像名称中删除userId。拥有公共userId可能会在未来引起问题。 此外,仅使用uniqid()即可。

$avatarName = uniqid();
// add extension if needed, store it

我同意。我只是按照原帖的想法进行了编辑。 - acm
我在我的应用程序的不同位置公开使用$userId。它是否应该被隐藏?如果我在SO上点击您的个人资料,我会在URL中得到一个ID:333893。这不是您的用户ID吗?还是另一个字段? - Max
@Max:说实话,只要你在应用程序中关注SQL注入和类似的问题,就不应该有任何问题(我目前想不起来其他原因了)。无论如何,为什么你需要在文件名中加入$userId?我能想到的任何理由一旦你添加了一些随机内容就会变得无用。 - acm
好的,谢谢!实际上我很喜欢你的解决方案。我不认为我需要在文件名中使用user_id。我只是担心我的其他代码片段(我使用类似于SO的URL结构) :) - Max

1

你有没有考虑在你的 .htaccess 文件中配置 ETags

参见:

http://developer.yahoo.com/blogs/ydn/posts/2007/07/high_performanc_11/

虽然你可以更改文件名,但你需要管理清理和指向操作(删除/重命名旧文件,告诉应用程序新文件)。如果你愿意这样做,你可以在上传时将用户ID与Unix时间戳简单地连接起来,很少会有人能够在同一秒内上传相同的文件。如果你想让它变得更加唯一,请追加随机数字/独特标识符。

我从未听说过这个,但我一定会去了解它。 - Max

0

使用随机数时,发生冲突的可能性微乎其微(可以忽略不计),但既然您正在存储此数字,为什么不从1开始,每次增加该数字呢?


问题在于每次我都需要查询数据库才能知道下一个是哪个。或者你有其他想法吗? - Max
你可以为所有用户保留一个主要的数字,但每次使用它时仍需要将其保存回数据库。 - aronp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接