對於圖片或者文件的存儲,目前主要兩種方式:
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”(最前面帶有斜杠)