如何从 PHP 中的 mysql 数据库中提取可能损坏的图像 blob 并保存到文件

How to extract possibly corrupt image blobs from a mysql database in PHP and save to files

我有一个数据库 table,其中包含收据图像,编码为 PHP 中的 BLOB 数据。 table 具有以下列和数据:

id   | ownerid | file | filename            | size   | type       | fileerror
-----|---------|------|---------------------|--------|------------|-----------
1644 |       9 | BLOB | 2014-03-0714.30.jpg | 996379 | image/jpeg |      NULL

文件类型是在原始上传时使用 iMagickGD 之一通过网络表单捕获的,转换为 blob,并且存储在数据库中。

架构可能在某个时候从 MyISAM 转换为 InnoDB。编码可能已从 Latin1 转换为 UTF8-unicode-ci 。它也可能一直都是这样设置的。

我随后尝试了所有将 BLOB 转换回我能想到的图像的方法,但是我从未以图像结束。

我试过使用 Imagick::readImageBlob($myBlob) 并以一个不想成为图像的大胖文件结束,我试过使用 imagecreatefromstring($myBlob).

我正在使用 file_put_contents() 保存文件。

我收集到 BLOB 是二进制的,应该保持二进制,并且编码不应该影响它们...但是我不能再让我的 blob 成为图片了。

我如何判断:

  1. 我的二进制 blob 在数据库中损坏了,我应该放弃了。
  2. 我的二进制 blob 很好,谢谢,我的 PHP 技能让我失望了。
  3. php 幕后发生了某种字符编码问题,我可以解决。

我只是尝试将 blob 直接保存到 mysql workbench 的文件中,但这也没有帮助。

编辑:blob 的一点味道(取自我转储的文件,来自 chrome)

/9j/4FwwEEpGSUZcMAEBAVwwYFwwYFwwXDD/4Vww8kV4aWZcMFwwTU1cMCpcMFwwXDAIXDAMAVwwXDADXDBcMFwwAQmQXDBcMAEBXDADXDBcMFwwAQcsXDBcMAEPXDACXDBcMFwwBE

尝试

file_put_contents('/path/to/file.jpg', $myBlob);

或者

$myImage = imagecreatefromstring($myBlob);
imagejpeg($myImage, '/path/to/file.jpg', 80);

根据您发布的 BLOB 数据,文件幻数 /9j/4 是 jpeg;base64,所以这应该是其中的一部分:

$data = base64_decode($data)
file_put_contents('2014-03-0714.30.jpg', $data);

数据看起来像 JPEG:

 ╪ α[=11=]►JFIF[=11=]☺☺☺[=11=]`[=11=]`[=11=][=11=] ß[=11=]≥Exif[=11=][=11=]MM[=11=]*[=11=][=11=]\0♀☺[=11=][=11=]♥[=11=][=11=][=11=]☺       É[=11=][=11=]☺☺[=11=]♥[=11=][=11=][=11=]☺,[=11=][=11=]☺☼[=11=]☻\    0[=11=][=11=]♦

但是斜杠 \ 看起来很可疑,所以数据可能在编码之前已经被转义,所以尝试:

$data = stripslashes(base64_decode($data));

哪个更好看:

 ╪ α ►JFIF ☺☺☺ ` `   ß ≥Exif  MM *  ♀☺  ♥   ☺   É  ☺☺ ♥   ☺,  ☺☼ ☻   ♦

为了比较,类似于维基百科的 Stonehenge:

 ╪ α ►JFIF ☺☻☺ x x   ß▬Exif   MM *  ☺↕  ♥   ☺☺ ☺→♣  ☺ b☺←♣ ☺j☺(♥ ☺☻ ☺1