2013-07-19 153 views
1

我在MySQL數據庫中存儲小拇指。使用PHP,我從圖像創建一個縮略圖,然後將其存儲到一個BLOB列中。在MySQL中存儲圖像BLOB

MySQL似乎將二進制映像保存爲數據庫中的Base64字符串。問題是MySQL似乎將它存儲爲application/octet-stream而不是jpg文件。

我知道,因爲我測試的Base64編碼字符串,此代碼:

<?php 
$encoded_string = "...."; 
$imgdata = base64_decode($encoded_string); 

$f = finfo_open(); 

$mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE); 

echo $mime_type; 
?> 

是MySQL的自動我的形象轉換到Base64字符串?如果是這樣,有沒有辦法確保它保存爲JPG?


我知道節約大拇指文件系統是更好,但不幸的是這是情況並非如此,我不是在尋找的答案,將其保存到文件系統。我想知道爲什麼它被保存爲octed stream

我使用WideImage創建拇指,像這樣:

 $thumb = \WideImage::load ($filepath) 
          ->resize(117, 88) 
          ->crop ('center', 'center', 117, 88) 
          ->asString('jpg'); 

變量$thumb包含有效的二進制數據。因爲我可以打印它,它看起來不錯,而且fwrite寫了一個很好的JPG。

然後我用INSERT查詢將它保存到數據庫中。但是當我再次選擇它時,它給了我一個octed stream格式。

+4

應該將圖像存儲在文件系統上並通過MySQL引用它們。 –

+2

mysql不使用base64來存儲blob。 base64是一種非常節省空間的格式,並且在原始二進制版本上花費你大約33%。 MySQL也不太關心MIME類型。如果你說它是一團糟,那麼它只會進入一系列的位。不要緊,如果它是一個JPG格式,PDF格式,或你的奶奶的蘋果派配方文本格式。 –

+0

您只需回顯blob即可獲取圖像。我不認爲MySQL真的關心MIME類型。 –

回答

2

最好的方法是將圖像存儲在文件系統上,然後通過MySQL引用其位置。不建議將圖像存儲在MySQL中。爲什麼在你的數據庫中增加額外的不必要的應變?所有的大型網站(Facebook等)都將他們的圖像存儲在文件系統中。

+2

所有的大型網站可能都有一個或多個專用服務器。對於託管計劃的普通Joe,可能會有文件數限制。例如,我被限制爲1000.從中扣除的PHP文件,它不會留下太多。 – Twifty