0

我在共享主机帐户上有 MySQL 5.1.65,在将图像插入到我的图像表(InnoDB)中时遇到了麻烦,该表有 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;

我正在使用 PDO 从 PHP 5.2.17 连接到 db。我尝试 PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" 在我的连接中进行设置,因为在 SO 和网络上对类似(或相同)问题的一些答案中建议了它,但它并没有解决问题。我还检查了 MySQL 配置中允许的最大数据包,它设置为 16,777,216,这应该足够了,因为我不允许上传大于 5 MB 的图像。

我不知道它是否相关,但我在事务中插入数据,在该事务中我也对其他表进行多次插入。

        $image_params = array(
            "description" => $data->description,
            "image" => $image->getBinary() // Basicaly does file_get_contents() and returns
        );
        $image_statement = $pdo->prepare(
                "INSERT INTO images (description, image)
                VALUES(:description, :image)"
        );

        $pdo->beginTransaction();

        $image_statement->execute($image_params);
        $some_other_statement->execute($params);

        $pdo->commit()

在 phpMyAdmin 中,当我浏览图像表时,图像列始终显示 [BLOB - 15B],当我访问它时,我得到包含“资源 id #[id]”的 .bin 文件,其中 [id] 是图像的 id。

谢谢你,维克托

4

1 回答 1

2

我找到了解决我的问题的方法!$image->getBinary()方法返回 GD 图像资源而不是实际的二进制图像字符串,所以我将其更改为:

    public function getBinary() {
        ob_start();
        imagejpeg($this->image);
        return ob_get_clean();
    } 

现在可以了!吸取了教训,我可以继续我的项目了!:)

于 2012-12-15T22:00:22.643 回答