【发布时间】:2013-07-19 01:55:19
【问题描述】:
我将小拇指存储在 MySQL 数据库中。使用 PHP,我从图像创建缩略图,然后将其存储到 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 格式。
【问题讨论】:
-
应该将图像存储在文件系统上并通过 MySQL 引用它们。
-
mysql 不使用 base64 存储 blob。 base64 是一种空间效率非常低的格式,与原始二进制版本相比,它的成本约为 33%。 MySQL 也不关心 mime 类型。如果你说它是 blob,它只会以位序列的形式出现。不管是 jpg、pdf 还是文本格式的你奶奶的苹果派食谱。
-
您可以直接回显 blob 以获取您的图像。我不认为 mysql 真的关心 mime 类型。
-
向我们展示存储图像的代码。很可能它已通过处理函数转换为八位字节流
-
@Jarek.D 我正在使用 WideImage 创建拇指并将二进制数据写入我保存到数据库的字符串。当我
fwrite将二进制数据写入磁盘时,图像看起来不错。当我将其插入数据库然后再次检索它然后将其写入文件系统时,它是octet stream类型。我只是使用 MySQL 查询来插入它。仅此而已...