存储上传图像的最佳方法

时间:2010-03-15 05:24:47

标签: php codeigniter file-upload

将图像作为blob存储在数据库中与在数据库中仅存储文件名相比有哪些优点和缺点。

我正在使用PHP(CodeIgniter)和MySQL。

我知道这个问题是主观的,但客户问我这个问题,我无法给出一个好的答案。

3 个答案:

答案 0 :(得分:14)

我通常会说:

  • 数据库难以扩展:
    • 由于图像而拥有大小为几GB的数据库会使很多事情(例如,备份)变得更难。
    • 您是否希望在数据库服务器上加载更多负载以提供...文件?
  • 从文件系统提供图像是Web服务器做得很好的事情
    • 它允许用户执行某些任务(例如生成缩略图)而不涉及数据库服务器
    • 我想,如果需要的话,使用普通旧文件也会让你想要使用某种CDN的日子变得更轻松

这意味着我几乎总是将图像/文件存储在文件系统中,并且只存储文件的名称​​(可能还有大小和内容类型 - 总是有用的)数据库中。


考虑一下,这个问题可能是重复的......哦,是的,它实际上是;至少看到那些问题+答案:

答案 1 :(得分:1)

我怀疑你的客户有足够的经验来判断答案 客户曾要求我将图像严格存储到数据库中。经过一些调查后我发现它们只是意味着“在服务器端存储图像”,因为它们之前有一个MS Access数据库,它可以选择在数据库中存储图像还是只是链接到图像,而图像本身留在用户的硬盘上,经常无法使用。

至于你的问题,我怀疑这个图像与关系模型有任何关系。您无法根据blob内容对其他行进行排序,过滤,关联。虽然你必须做很多事情来支持数据库中的图像 - 显示专用脚本,模拟条件获取等。 我知道,这个功能存在。但是,更明显的尝试是追随时尚而不是真正的需求,特别是在网页开发中,图像通过单独的请求进行请求。

答案 2 :(得分:0)

我更喜欢在上传时重命名图像文件并将其存储到与其父级(用户,产品)相关的数据库行中...然后将它们上传到3个文件夹中:

/uploads
  /img
    /products
     /small 
     /medium 
     /xxl 

将它们调整为小(50x50),中(90x90),xxl(原始尺寸),然后再将它们移动到这些目录中。

如果你需要SEO图像,你可以存储它们,例如:

id | product | image
1    book      1-book.png

因此您将在同一图像文件中获取ID和产品名称。

或者您甚至可以存储

id | product | image
1    book      1.png

然后很容易附加src路径:

/*Config file*/
$config['base_static_products_url'] = 'uploads/img/products/';

/*View file*/

<img src="<?php echo base_url().$this->config->config['base_static_products_url'].'/small/'.$row->image ?>" alt=""/>

OR (no SEO)

<img src="<?php echo base_url().$this->config->config['base_static_products_url'].'/small/'.$row->id.'.png' ?>" alt=""/>