我正在使用Yii框架开发一个网站。在我的网站上,我有用户配置文件(已经实现)。我将有一个文件上传器,以便用户可以上传个人资料图片。一些个人资料可能对公众开放,其他个人资料则是私人的。公共用户无法访问私人个人资料,除个人资料所有者外,任何人都无法访问此个人资料中的图片。
我已经读过将图像存储在MySQL数据库中是一个坏主意,因为它会导致性能下降,并且可能在我的虚拟主机上不允许。我曾想过将图像存储在我的受保护目录中,但如果在这里完成,我根本无法链接到图像。那么我将如何在有效的配置文件(公共配置文件或属于用户的配置文件?)上显示图像?
任何提示或想法都将受到高度赞赏(与Yii,php或任何其他相关)。如果我的问题不清楚,请告诉我。谢谢。
*顺便说一句,我从未有过正式的网络开发课程,和其他很多人一样,我在自己的时间里学到了我所知道的一切,所以我很可能错过了一个非常简单/明显的解决方案。
答案 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
表中的用户图像名称。图像表
包含它自己的id
,user_id
和name
列。
在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为你做的。