如何私下存储用户个人资料图片,以便只有个人资料所有者可以访问?

时间:2012-02-28 18:47:38

标签: php yii

我正在使用Yii框架开发一个网站。在我的网站上,我有用户配置文件(已经实现)。我将有一个文件上传器,以便用户可以上传个人资料图片。一些个人资料可能对公众开放,其他个人资料则是私人的。公共用户无法访问私人个人资料,除个人资料所有者外,任何人都无法访问此个人资料中的图片。

我已经读过将图像存储在MySQL数据库中是一个坏主意,因为它会导致性能下降,并且可能在我的虚拟主机上不允许。我曾想过将图像存储在我的受保护目录中,但如果在这里完成,我根本无法链接到图像。那么我将如何在有效的配置文件(公共配置文件或属于用户的配置文件?)上显示图像?

任何提示或想法都将受到高度赞赏(与Yii,php或任何其他相关)。如果我的问题不清楚,请告诉我。谢谢。

*顺便说一句,我从未有过正式的网络开发课程,和其他很多人一样,我在自己的时间里学到了我所知道的一切,所以我很可能错过了一个非常简单/明显的解决方案。

3 个答案:

答案 0 :(得分:2)

通过php文件提供图像,可以检查当前会话是否具有权限

答案 1 :(得分:2)

用户上传照片后,随机重命名图像并将随机文件名存储在用户表中。

用户登录后,您当然会设置会话(至少是用户ID)。

创建image_profile.php并从该文件中的会话中获取user_id。之后,执行这样的查询:

SELECT `profile_image_filename`
FROM user WHERE user.id = {$SESSION['user_id']}
LIMIT 1;

然后发送{$profile_image_filename}.jpg,以便image_profile.php的结果将成为已登录用户的个人资料图片。 (如何动态输出图像?Output an Image in PHP

答案 2 :(得分:1)

用户上传图片后,获取随机图片名称,例如mt_rand(30,999)。 imageExtension。
将此值存储为image表中的用户图像名称。图像表 包含它自己的iduser_idname列。

在Yii Image模型中创建protected function afterSave()方法,该方法将您的图像存储在文件系统中。文件系统中的实际图像名称将包含数据库中的图像ID和数据库中的图像名称 不要忘记在此功能中添加以下内容:

return parent::afterSave();

例:
你有jpg图像叫me.jpg
mt_rand(30,999)给了我们421
所以你将你的jpg图像存储在数据库中 该行具有值:
id=7, user_id=3, name=421.jpg
现在,您以7_421.jpg的名称保存图像 通过这样做,您的图像将永远不会获得相同的名称两次,因为我们在图像名称的第一部分中使用的id是唯一的。此外,没有人会知道图像的名称,因为她/他将需要id和随机数。

要仅为所有者显示图像,您比较的已记录用户ID与user_id相同 通过做:

if(Yii::app()->user->id === $image->user_id) {
 // display photo
}

您无需处理会话。 Yii为你做的。