2012-06-05 120 views
3

我正在製作一個android應用程序,它將拍攝照片並將圖像(作爲base64編碼的字符串)推送到PHP腳本,從這裏我將在MySQL數據庫內存儲有關圖像的數據。在數據庫中存儲base64編碼圖像是明智嗎?

將圖像存儲在數據庫中是否明智(因爲它是作爲base64字符串傳遞的),將它轉換回圖像並將其存儲在文件系統中會更好嗎?

回答

4

base64編碼的圖像需要太多的位置(比二進制等效物大約多33%)。

MySQL提供二進制格式(BLOB,MEDIUM_BLOB),使用它們。

或者,大多數人更喜歡在數據庫中只存儲一個文件的密鑰,文件系統將更有效地存儲該文件,特別是如果它是一個大圖像。這是我長期喜歡的解決方案。我通常使用文件內容的SHA1哈希來形成文件的路徑,所以我沒有雙重存儲,並且如果我想要從文件中檢索記錄很容易(我使用三級文件樹兩個級別分別由前兩個字符和散列的字符3和4構成,以便我沒有太多目錄的直接子節點)。請注意,這是例如git存儲的邏輯。

將它們存儲在數據庫中的好處是您可以更輕鬆地管理備份,特別是只要您的項目很小。數據庫會爲你提供一個緩存,但你的服務器和客戶端也很難決定哪一個是最快的,而且差別不會很大(我想你不會做太多的併發寫入)。

+0

圖像將是200kb左右,我擔心從數據庫中調用它們。 – dotty

+0

這兩個解決方案(在磁盤上和數據庫)是常見的,完全可行的。我建議使用磁盤存儲的散列解決方案作爲我長期項目的首選,但這是有爭議的。 –

+0

我發現3級目錄樹在Windows服務器上非常慢。我不知道爲什麼。 –

0

我覺得「明智」是非常主觀的。我認爲從「讓人們直接鏈接到我的形象」的角度來看這將是明智的。此外,它可能會有所幫助,如果你決定你需要改變目錄結構等。它可能可能使你更容易(但這真的取決於你如何編寫你的腳本開始..),但其他比那個...副手我無法真正想到這樣做的好處。

+0

將這些圖像呈現給用戶時,我可以看到退格。物理圖像將被緩存,而數據庫服務的圖像將始終有一個來自數據庫的調用。 – dotty

+0

但由於這是一個移動設備,這可能實際上是一個好處,而不是一個缺點,是嗎? –

2

我已經完成了這兩種方法,每次我回到代碼中我將二進制數據存儲在MySQL表中時,我總是使用MySQL表中的指針將其切換到文件系統。

當談到性能時,你將會更好地去FS,因爲從MySQL服務器拉多個大BLOB將會使其管道很快飽和。通常這是一個你不想堵塞的管道。

2

您始終可以將base64_encode($image)保存在一個文件中,並且只將文件路徑存儲在數據庫中,然後使用fopen()獲取編碼的圖像。

我很抱歉,如果我不正確地理解這個問題。

相關問題