2012-01-29 6 views
0

У меня есть таблица с именами пользователей, и каждая строка (пользователь) имеет изображение.Создание эскизов из хранимых изображений mysql

Изображение хранится в виде BLOB в базе данных MySQL, используя этот код:

$filename = $_FILES['image']['tmp_name']; 
$size = getimagesize($filename); 
$handle = fopen($filename , "rb"); 
$content = fread($handle , filesize($filename)); 
fclose($handle); 
unlink($filename); 
$image = base64_encode($content); 
// .... send query to database .... 

Это работало на первый, но, как все больше и больше изображений должны быть показаны на каждой странице, он получает очень загружен, поэтому теперь я хочу создать эскизы, сохраненные в файловой системе сервера, используя php GD.

У меня есть следующий код, но я понятия не имею, что делать, чтобы прочитать изображение из базы данных, чтобы я мог создать его миниатюру.

$query = "SELECT * FROM users;"; 
$result = mysql_query($query); 
while($row = mysql_fetch_array($result)) { 
    $uploaded_image = base64_decode($row['image']); 
    $size = getimagesize($uploaded_image); <-------------------- 
    $dimension_x = 73; 
    $dimension_y = 73; 
    $directory = 'views/images/generated/people/'; 
    do{ 
    $filename = random_32(); 
    $filename = $directory.$filename.'.jpg';  
    } while(file_exists($filename)); 
$image = imagecreatefromjpeg($uploaded_image); 
$thumb = imagecreatetruecolor($dimension_x , $dimension_y); 
$size = getimagesize($uploaded_image); 
imagecopyresampled($thumb , $image , 0 , 0 , 0 , 0 , $dimension_x , $dimension_y , $size['0'], $size['1']); 
imagejpeg($thumb , $filename , 100); 
} 

Я пытаюсь найти, что я должен положить, где стрелка должна заставить скрипт работать.

Все это делает сейчас выводится

Warning: getimagesize(ÿØÿà): failed to open stream: No such file or directory in /var/www/play/ns4/models/create_thumbs_people.php on line 12 

Для каждой записи в базе данных.

---- ---- РЕДАКТИРОВАТЬ

забыл упомянуть, random_32() это функция, которая генерирует 32 символов случайной строки так, что изображения с именем.

ответ

2

И вот одна из многих причин, почему хранение файлов в базе данных является плохой идеей ...

getimagesize() работает с файлами, а не строк. Поскольку у вас есть необработанное изображение в строке, используйте imagecreatefromstring(), затем imagesx() и imagesy() функцию, чтобы получить размеры:

while($row = mysql_fetch_array($result)) { 
    $uploaded_image = base64_decode($row['image']); 
    $image = imagecreatefromstring($uploaded_image); 
    $uploaded_x = imagesx($image); // X dimension 
    $uploaded_y = imagesy($image); // Y dimension 
    etc.... 

Обратите внимание, что на самом деле имеет imagecreatefromstring немного смекалки и может сообразить, какой тип изображения, в отличие от довольно дебильных функций createfromgif/jpg/png/etc ..., которые работают только с этими конкретными типами файлов.

+0

Я пробовал ваш код, менял значения в imagecopyresampled, и он работал как шарм! – ppp

2

Вы на правильном пути, проблема в том, что $ uploaded_image - это содержимое изображения, а не путь к файлу. getimagesize требует имя файла в качестве первого аргумента.

Концептуально, вот изменение, которое должно быть сделано:

  • написать содержание $ uploaded_image во временную папку
  • вызова getimagesize на этом временном месте

Вот несколько примеров кода (непроверенные):

$uploaded_image = base64_decode($row['image']); //this is from your code above, should work fine 
$uploaded_temp_file = tempnam(sys_get_temp_dir(), 'user_image'); //generate a temporary file name in your OS's temp folder 
$uploaded_temp_res = fopen($uploaded_temp_file, 'wb'); //open the file for binary write 
fwrite($uploaded_temp_res, $uploaded_image); //commit binary data to the file 
fclose($uploaded_temp_res);  //close the file handle 
$size = getimagesize($uploaded_temp_file);  //finally, get the image size 

Обратите внимание, что вы будете ant, чтобы добавить обработку ошибок, а что нет.

+0

Благодарю вас за ваше время. Я уже пошел другим путем, когда увидел ваш ответ, поэтому я сделал то, что предложил @Marc B. – ppp

Смежные вопросы