Сохранить imagepng в базе данных MySQL - PullRequest
4 голосов
/ 26 марта 2012

У меня есть скрипт, который создает изображение и вызывает imagepng для вывода его в браузер. Вместо этого я хотел бы сохранить его в базе данных MySQL (в виде большого двоичного объекта). Я знаю, как прочитать файл в подготовленное утверждение

while ($data = fread($fp, 1024)) {
    $size += strlen($data);
    $stmt->send_long_data(0, $data);
}

Проблема в том, что я не хочу, чтобы imagepng записывал в файл только для того, чтобы я мог прочитать его обратно в базу данных.
Есть ли простой способ сделать это?

UPDATE: Вот как я пытался использовать буферизацию вывода:

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();

База данных не обновлена ​​и ошибок нет.

1 Ответ

10 голосов
/ 26 марта 2012

Из того, что я только что прочитал в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...