图片或文件在数据库存储

对于图片或者文件的存储,目前主要两种方式:

1.把图片直接以二进制形式存储在数据库中;

  一般数据库提供一个二进制字段来存储二进制数据。比如mysql中有个blob字段。oracle数据库中是blob或bfile类型。

2.图片存储在磁盘上,数据库字段中保存的是图片的路径;

 

下面详细介绍一下这两种存储方式。

一、图片以二进制形式直接存储在数据库中:

  1.存储实现:

  大体思路:

  (1)、将读取到的图片用程序转化成二进制形式;

  (2)、结合insert into 语句插入数据表中的blob类型(bfile类型)字段中去。

  (3)、 从数据库取出图片展示的时候。则是直接发送图片内容

  2.关于mysql中的blob类型

   bolb像int型那样,分为blob、MEDIUMBLOB、LONGBLOB。其实就是从小到大,

  blob 容量为64KB ,MEDIUMBLOB 容量为16M,LONGBLOB 容量为4G。

  通常是采用语言的serialize()函数,将对象序列化以后,存入该类型的。(serialize()返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方)。

  3. 缺点

  (1).占用与mysql交互的通信时间;

  (2).图片一般比较大,超过1M后,还需要修改mysql中限制通信数据大小的配置

  (3).影响数据库性能,导致限制了整个程序的性能;

  4.优点

  (1).备份图片数据和迁移数据方便

   图片以二进制形式存储在数据库,有一个好处:备份的时候方便。直接备份数据库,图片也跟着备份。换句话说,迁移环境的时候是方便。而图片放在磁盘上的话,数据库中存储的只是图片路径。备份数据库后。磁盘上的图片也要跟着备份才行。

   但是,备份这个好处不是很明显。图片在磁盘上,备份磁盘也没很大的事情。打包压缩也可以了。互联网环境毕竟与传统的软件开发不同,web开发比较关注网站速度。也就是数据库的速度。就像互联网开发中,有时候为了速度,用空间换时间的做法比较普遍,所以往往在设计数据库的时候并不一定遵循传统数据库设计三大范式。

  总结:处理代码感觉还真比较麻烦,而且图片二进制放到数据库,会加重数据库的负担。正常来讲,互联网环境中,大访问量,数据库速度和性能方面很重要。一般在数据库存储图片的做法比较少,更多的是将图片路径存储在数据库中,展示图片的时候只需要连接磁盘路径把图片载入进来即可。因为图片是属于大字段。一张图片可能1M到几M。

 

二、数据库中保存图片路径:

  1. 存储思路:

 

  (1).按照年月日生成路径。具体是按照年月日还是按照年月去生成路径,根据自己需要(不一定是按照日期去生成);

   (2).将文件分散到多个文件夹中;

 

    操作系统对单个目录的文件数量是有限制的。当文件数量很多的时候。从目录中获取文件的速度就会越来越慢。所以为了保持速度,才要按照固定规则去分散到多个目录中去。

   (3).通常使用时间戳来命名文件(比如1343287394783. jpg,这样子是为了避免文件名重复,多个人往同一个目录上传图片的时候会出现);

  那么按照以上规则,将图片分散到磁盘路径中去。数据库字段中保存的是类似于这样子的”images/2012/09/25/ 1343287394783.jpg”

   注意:保存的磁盘路径,是”images/2012/09/25/1343287394783.jpg”,而不是” /images/2012/09/25/ 1343287394783.jpg”(最前面带有斜杠)

 

posted on 2021-05-10 16:04  BigBom原子  阅读(2868)  评论(0编辑  收藏  举报