我有一个名为users的表,每行(用户)都有一个图像。
使用以下代码将映像作为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个字符长的随机字符串的函数,以便命名图像。
答案 0 :(得分: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 ...函数,它只适用于那些特定的文件类型。
答案 1 :(得分:2)
你走在正确的轨道上,问题是$ 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
请注意,您需要添加错误处理,而不是。