2013-07-19 189 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