2009-11-07 124 views

回答

0

这里是存储在MySQL数据库上的二进制图像的example。我不太确定是否有任何优势。我会留给别人评论。

你可以做的另一种方式是存储图像的位置在一列,它查询引用。

+1

是的,我会建议反对,除非有某些原因需要保护图像。通过这样做,首先需要从数据库中提取图像,然后处理二进制文件。这将增加PHP服务器以及MySQL服务器的负载。你的第二条建议是更好的;将图像存储在用户图像文件夹中,或许用uniqid()命名它们,然后在数据库中引用该相对URL。 – BraedenP 2009-11-07 05:34:06

2

如果我是你,我只是将图像保存在你的网站目录的某个地方,然后将链接保存到MySQL中的图像,如果你真的想将它保存在数据库中,我会把它读入一个字符串,然后base64_encode()它,然后将其保存在数据库中。

有您将它们存储在数据库中遇到一点麻烦的种种,你必须创建脚本来呼应他们回来了ECT,以及服务器和数据库负荷将大大增加。如果我是你,我只是存储参考。

1

我建议有您存储喜欢的用户名,名字用户数据的表。在该表中创建一个名为“avatar”的字段,您可以在其中存储文件引用。

假设你的用户头像都存储在:htdocs中/图片/化身/ 而用户apikot有阿凡达“avatar.jpg”存储agains它的用户在数据库中,然后你可以生成图像标签时,编译以下网址:“/htdocs/images/avatars/avatar.jpg”。

0

创建一个BLOB类型字段,并插入的file_get_contents($镜像文件)

16

的结果,“最佳”取决于你的目标是什么。

存储用户上传图像的两种主要方式是将二进制内容作为BLOB放入数据库,或将图像存储到某处的驱动器,并向数据库中放入指示哪个图像属于哪个位置的条目。

将图像放置在数据库中的优点是不需要在网络服务器上具有任何类型的文件系统权限,并且在您从多个网络服务器提供网站时删除任何类型的同步问题。但是,随着时间的推移,它会使您的数据库变得庞大,如果您没有正确设计表格,它绝对会损害您的性能和可伸缩性。

在文件系统中存储的图像以文件有使检索极其快速,高效的附加优势,因为Web服务器是在提供静态文件非常好。

编辑补充

如果你决定要在数据库中存储的文件内容,绝对不要把它放在需要快速访问的表。例如,如果您有几乎每个综合浏览量都搜索到的“用户”表,那么该表是而不是放置文件内容的地方。相反,请创建一个包含文件和相关元信息的单独“图像”或“文件”表。

投入大量每行的字节到表使得该表很慢的工作。你不想在桌子上看到那种看起来很重要的东西。

+0

如果你打算使用数据库,这是一个非常好的主意。为了减轻图像表上的负担,使用memcache来缓存图像也会有所帮助。 – BraedenP 2009-11-07 05:38:17

+0

推论:如果您的文件内容需要快速访问,请不要将其存储在数据库中。 – 2009-11-07 05:40:24

13

图片应该被存储在文件系统上的一对夫妇的原因:

  • 代理和IF-Modified-Since的Web请求: Apache可以处理如果-Modified-Since的HTTP标头为你并返回一个304响应,这就是您可以获得的最佳性能。在互联网服务提供商处发布的反向Squid代理和代理将尝试利用这一点。

  • 病毒扫描:如果你允许任何文件上传,混蛋将尝试上传可怕的东西,看看他们是否可以破坏你的网站。想要对您的用户上传运行ClamAV等来查看是否存在问题并非不合理。如果您想扫描记录中的恶意软件,则不会希望捆绑数据库。

  • 模式简单:如果您允许文件上传,您还需要添加有关MIME类型,文件大小,高度和宽度的元数据。如果文件本身与表中的MIME类型不匹配,那么您需要对表中的选择进行编码并将其流式传输到/usr/bin/file。它可以更简单shell_exec("/usr/bin/file /path/to/mumble")

  • 拇指钉钉:用户图片上传很可能需要进行拇指钉钉,而且这通常比实际的web请求异步更容易。当一些好的用户试图上传他们的专业摄影师伙伴给他们的150MB photoshop文件时,并且你的apache实例在试图在web worker的内存空间中加载ImageMagick库时会OOM,这真的没有乐趣。这对于apache工作人员来说确实不成比例。在Apache之外创建一个工作队列/ cron作业来处理这项工作。

  • 表损坏:哇,如果您的MySQL索引文件变为borked并且您需要在该表上执行脱机表修复,您并不是真的想要削弱所有用户头像。

  • 备份和恢复:你并不是真的想用mysqldump锁定一个大表。使用rsync将为您节省大量时间并为您提供更多的灵活性。表格通常会在整个表格中一次性恢复 - 表格通常不会以较小的片段进行备份。

3

在服务器上为每个用户创建一个新的目录,其中用户标识为目录的名称并将用户的图像保存在其中。每当你想显示用户的图像:

<img src="<path>/users_images/<user_id>/thumb.gif" /> 
相关问题