2

我将图像数据存储在图像表的 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 所以我猜这个˙Ř˙ŕ序列只是一些奇怪的(至少对我而言)error_log 行为当给定空输入字符串时。

从 API返回empty($img)或直接返回到isset($img)并在那里输出都可以始终如一地工作,因此在传输图像数据时可能不会出现一些错误。count($img)image.php

我正在获取没有其他问题或错误的行(其他列按预期工作)。

此外,当我单击 phpMyAdmin 中的 BLOB 列时,它显示存储的图像没有问题或错误,因此图像被正确存储,唯一的问题可能是从数据库中检索它时。我还检查了 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(使用流) 但在我的情况下两者都不起作用,并且在这两种情况下$img都是空的。我也尝试过这样的连接,正如在类似问题中所建议的那样

$dbh = new PDO("mysql:host={$db['host']};dbname={$db['name']}", $db['user'], $db['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

并且没有SET NAMES命令,两者都对我的问题无能为力。

我很绝望,我不知道该怎么办了,现在已经很晚了,所以我现在要睡觉了,我真诚地希望我能梦想一个解决方案,或者至少你们中的一些人会知道出了什么问题并写下为我准备或分享一个有用的链接:)

PS 我知道将图像存储在 db 中并不是一个好主意,但我决定这样做,因为我对这个项目的截止日期很紧,而且我对以文件系统的方式做这件事还不够了解,并认为我使用 db 方法将节省一些时间。我当然没有节省任何时间:)

4

2 回答 2

0

LOB 的 PDO 处理似乎存在错误:https ://bugs.php.net/bug.php?id=40913 。在撰写本文时,该错误仍未解决。

于 2013-05-23T16:30:12.760 回答
0

我对您的建议有类似的问题,请执行以下操作:

第一次尝试:当您将图像保存在数据库中以使用base64_encode将其转换为十六进制时。要在生成图像之前使用base64_decode进行相反的显示。

如果失败,您可以尝试以下操作: 打开文件。Notepad++中的“PHP” ,转到Format -> convertes to UTF-8 (without BOM)

出于某种原因,使用 UTF-8(带有 BOM)格式化文件会生成无效字符。

于 2013-08-11T03:08:02.703 回答