我将图像数据存储在图像表的MEDIUMBLOB列中,如下所示:
CREATE TABLE IF NOT EXISTS `images` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`description` varchar(160) DEFAULT NULL,
`image` mediumblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我有images.php
脚本接收要显示的图像的id
,调用应该接收图像id
参数的API(以及与此问题无关的其他内容)并返回二进制文件从image
列到应显示它的images.php
脚本的字符串。
这是API(实际上是一个imageController)的一部分,它从db获取图像数据,将其加载到我的Image
类,它根据前几个字节签名确定图像类型并返回相应的mime类型。
$pdo = Database::getPDO($db);
$select_image_statement = $pdo->prepare(
"SELECT image FROM images WHERE id = :id"
);
$select_image_statement->bindParam(":id", $image_id);
$select_image_statement->execute();
$select_image_statement->bindColumn(1, $img, PDO::PARAM_LOB);
$select_image_statement->fetch(PDO::FETCH_BOUND);
$image = new Image();
$image->load($img);
$return = array(
'image' => $img,
'mime_type' => $image->getMimeType()
);
return $return;
问题虽然$img
绑定变量在我使用˙Ř˙ŕ
输出时error_log($img)
序列始终包含echo
,但在image.php
脚本中输出header()
时没有empty()
)我得到空白页面,˙Ř˙ŕ
也返回1,所以我猜empty($img)
序列只是给定空输入字符串时error_log的一些奇怪的行为(至少对我而言)。
将isset($img)
或count($img)
或image.php
直接从API返回到$img
并在那里输出所有内容都一致,以便在传输图像数据时可能没有出现错误
我正在获取没有其他问题或错误的行(其他列按预期工作)。
此外,当我从phpMyAdmin点击BLOB列时,它显示存储的图像没有任何问题或错误,因此图像存储在核心,唯一的问题可能是从db中检索它。 我还检查了MySQL配置中的最大允许数据包,它设置为16,777,216,这应该足够,因为我的图像最大为5 MB(我想要检索的是~100 kB)
我花了大约6个小时尝试修复它并浏览类似的问题,阅读我使用的每个PDO方法的PHP文档和用户注释,我尝试了所有建议的方法来限制列,不同的提取选项等等但是没有一个解决了我的问题。我尝试这样做http://php.net/manual/en/pdo.lobs.php#96311和“官方”方式http://php.net/manual/en/pdo.lobs.php(使用流),但两者都不适用于我的情况,在这两种情况下$dbh = new PDO("mysql:host={$db['host']};dbname={$db['name']}", $db['user'], $db['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
都是空的。
我也尝试过这样的连接,正如SO在
SET NAMES
并且没有{{1}}命令,这两个命令对我的问题都没有任何作用。
我很绝望,我不知道该怎么办了,现在已经很晚了,所以我现在要睡觉了,我真诚地希望我能想到一个解决方案,或者至少有些人会知道什么是错了,写给我或分享一个有用的链接:)
P.S。我知道在db中存储图像看起来并不是一个好主意,但我决定这样做,因为我对这个项目有一个紧迫的截止日期,我对文件系统的方式做得不够,并认为我会用db方法节省一些时间。我当然没有保存任何时间:))
答案 0 :(得分:0)
PDO处理LOB时似乎存在一个错误:https://bugs.php.net/bug.php?id=40913。 在撰写本文时,该错误仍未解决。
答案 1 :(得分:0)
我的建议也有类似问题,请执行以下操作:
首次尝试: 将图像保存到数据库中时,使用 base64_encode 将其转换为十六进制。要在生成图像之前使用 base64_decode 显示相反的内容。
如果失败,您可以尝试以下操作:打开文件。 Notepad++中的“PHP”,转到格式 - >转换为UTF-8(无BOM)
出于某种原因,使用UTF-8(带BOM)格式化文件会生成无效字符。