如何从 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
文件类型是在原始上传时使用 iMagick 或 GD 之一通过网络表单捕获的,转换为 blob,并且存储在数据库中。
架构可能在某个时候从 MyISAM 转换为 InnoDB。编码可能已从 Latin1 转换为 UTF8-unicode-ci 。它也可能一直都是这样设置的。
我随后尝试了所有将 BLOB 转换回我能想到的图像的方法,但是我从未以图像结束。
我试过使用 Imagick::readImageBlob($myBlob)
并以一个不想成为图像的大胖文件结束,我试过使用 imagecreatefromstring($myBlob)
.
我正在使用 file_put_contents()
保存文件。
我收集到 BLOB 是二进制的,应该保持二进制,并且编码不应该影响它们...但是我不能再让我的 blob 成为图片了。
我如何判断:
- 我的二进制 blob 在数据库中损坏了,我应该放弃了。
- 我的二进制 blob 很好,谢谢,我的 PHP 技能让我失望了。
- 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
我有一个数据库 table,其中包含收据图像,编码为 PHP 中的 BLOB 数据。 table 具有以下列和数据:
id | ownerid | file | filename | size | type | fileerror
-----|---------|------|---------------------|--------|------------|-----------
1644 | 9 | BLOB | 2014-03-0714.30.jpg | 996379 | image/jpeg | NULL
文件类型是在原始上传时使用 iMagick 或 GD 之一通过网络表单捕获的,转换为 blob,并且存储在数据库中。
架构可能在某个时候从 MyISAM 转换为 InnoDB。编码可能已从 Latin1 转换为 UTF8-unicode-ci 。它也可能一直都是这样设置的。
我随后尝试了所有将 BLOB 转换回我能想到的图像的方法,但是我从未以图像结束。
我试过使用 Imagick::readImageBlob($myBlob)
并以一个不想成为图像的大胖文件结束,我试过使用 imagecreatefromstring($myBlob)
.
我正在使用 file_put_contents()
保存文件。
我收集到 BLOB 是二进制的,应该保持二进制,并且编码不应该影响它们...但是我不能再让我的 blob 成为图片了。
我如何判断:
- 我的二进制 blob 在数据库中损坏了,我应该放弃了。
- 我的二进制 blob 很好,谢谢,我的 PHP 技能让我失望了。
- 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