2012-01-29 78 views
0

我有一个名为users的表,每行(用户)都有一个图像。从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 

对于数据库中的每个条目。

---- ---- EDIT

忘记提到,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 2012-01-29 02:32:23

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 

请注意,蚂蚁添加错误处理和不。

+0

谢谢你的时间。当我看到你的答案时,我已经走了另一条路,所以我做了@Marc B的建议。 – ppp 2012-01-29 02:38:42