我有一个脚本可以创建图像并调用imagepng
将其输出到浏览器。
相反,我想将它保存到MySQL数据库(作为blob)。
我知道如何将文件读入准备好的声明
while ($data = fread($fp, 1024)) {
$size += strlen($data);
$stmt->send_long_data(0, $data);
}
问题在于我不想让imagepng
写入文件,因此我可以将其读回数据库。
有没有一种简单的方法可以做到这一点?
更新 以下是我尝试使用输出缓冲的方法:
ob_start();
imagepng($dst_r,null);
$img = ob_get_clean();
$db = Database::getInstance(); // Singleton on MySQLi
$s = $db->prepare("UPDATE " . $db->getTableName("Users") . " SET `Picture` = ? WHERE `UserID` = ?" );
$s->bind_param('bi', $img, $_POST['UserID']);
$s->send_long_data(0, $img);
$s->execute();
数据库未更新且没有错误。
答案 0 :(得分:10)
从我刚刚在php.net中阅读的内容中,您可以使用ob_start(),ob_get_contents& ob_end_clean()
混合,我的意思是:
ob_start();
imagepng($image);
$imageContent = ob_get_contents();
ob_end_clean();
如果我是你,我会把它保存在一个临时文件中,但按照你的意愿保存:)
编辑: 我认为您的数据库管理也存在问题。以下是可能的作用
//include here the thing to get $imageContent
$db = Database::getInstance(); // Singleton on MySQLi
$s = $db->prepare("UPDATE " . $db->getTableName("Users") . " SET `Picture` = ? WHERE `UserID` = ?" );
$null = NULL;
$s->bind_param('bi', $null, $_POST['UserID']);
$byteToSend = 1024;//this should equals the max_allowed_packet variable in your mysql config (usually in my.cnf config file)
$i=0;
while ($contentToSend = substr($imageContent, $i, $byteToSend)) {
$s->send_long_data(0, $contentToSend);
$i+=$byteToSend;
}