【问题标题】:Best approach for storing uploaded image存储上传图像的最佳方法
【发布时间】:2011-01-27 13:34:30
【问题描述】:

将图像作为 blob 存储在数据库中与仅将文件名存储在数据库中的优点和缺点是什么。

我在 MySQL 中使用 PHP(CodeIgniter)。

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

【问题讨论】:

    标签: php codeigniter file-upload


    【解决方案1】:

    我一般会这么说:

    • 数据库更难扩展:
      • 由于图像而拥有几 GB 大小的数据库会使许多事情(例如备份)变得更加困难。
      • 您想在您的数据库服务器上增加更多负载,以提供...文件吗?
    • 从文件系统提供图像是网络服务器擅长的事情
      • 它允许人们在不涉及数据库服务器的情况下执行一些任务(例如生成缩略图)
      • 我想,如果需要的话,使用普通的旧文件也会让你想使用某种 CDN 的那一天变得更容易

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


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

    【讨论】:

    • Pascal MARTIN,您的回答似乎很有说服力。但是,我必须声明,在尝试了这两种方法后,我并没有真正看到性能上有太大差异(即,在外部存储图像,而不是将它们作为 BLOBS 保存在数据库中)。也许我的数据量并不多。另一个问题是,您是否建议从数据库中读取多个 BLOB 图像比从文件系统中读取多个文件要慢?老实说,我不能接受,但我看到的唯一问题是,如果文件保存在外部,备份可能会更小。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我更喜欢在上传时重命名图像文件并将它们存储到与他自己的父级(用户、产品)相关的数据库行中......然后将它们上传到 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=""/>
      

      【讨论】:

      • 看,这也取决于你是否需要将所有图像存储在同一个文件中,如果你知道你将只使用 png 文件或只使用 jpg 文件,你也不能在 db 中存储任何东西而只是使用 row_id.png 上传文件时重命名文件
      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2018-01-31
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      相关资源
      最近更新 更多