【问题标题】:Store image in MySQL BLOB在 MySQL BLOB 中存储图像
【发布时间】: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 查询来插入它。仅此而已...

标签: php mysql base64 blob


【解决方案1】:

最好的方法是将图像存储在您的文件系统上,然后通过 MySQL 引用它的位置。不建议在 MySQL 中存储图像。为什么要对您的数据库施加额外的不必要压力?所有大型网站(Facebook 等)都将其图像存储在文件系统中。

【讨论】:

  • 所有大型网站都可能拥有一台或多台专用服务器。对于拥有托管计划的普通乔来说,很可能存在文件数限制。例如我限制在1000个。从中扣除php文件,它不会留下太多。
【解决方案2】:

在数据库中存储图片和其他文档有很多很好的理由。 1、对图片或文档的位置有一定的控制。当存储为单个文件时,很容易移动、意外删除或丢失内容。备份也很方便。通过将文档保存在数据库中。由于必须从数据库中检索文档,因此访问速度会变慢。

如果存储为单个文件并在数据库中引用,则在移动文档时引用将失效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 2019-04-03
    • 2011-01-14
    • 1970-01-01
    • 2011-06-07
    • 2020-10-04
    • 2010-12-26
    • 2019-11-21
    相关资源
    最近更新 更多