保存图片到数据库
$query =$myClass->query("insert into tblImage(document) values(".base64_encode(file_get_contents($_FILES['imageFile']["tmp_name"])).")");
显示数据库中的图像
$image =$myClass->query("select document from tblImage where code=1");
$output_bin_string = base64_decode($image[0]['thumbDocument']);
header("Content-Type: image/jpeg");
header("Content-Length: " . strlen($output_bin_string));
echo $output_bin_string;
我可以保存图像到文件,然后保存到数据库
$image=$myClass->query('select document form tblImage where code=1' );
$source = imagecreatefromstring(base64_decode($image[0]["document"])) ;
$rotate = imagerotate($source,$degrees,0);
imagejpeg($rotate,'tmp/1.jpg');
$image =$myClass->query("update tblImage set document='".base64_encode(file_get_contents('tmp/1.jpg'))."' where code=1");
问题:有一种方法可以旋转图像并保存到数据库,而不需要像这样保存图像到文件
$image=$myClass->query('select document form tblImage where code=1' );
$source = imagecreatefromstring(base64_decode($image[0]["document"])) ;
$rotate = imagerotate($source,$degrees,0);
$image =$myClass->query("update tblImage set document='".base64_encode($rotate)."' where code=1");
此代码显示错误:base64_encode() expects parameter 1 to be string, resource given
在数据库中保存文件是一种糟糕的做法,与本地文件系统访问或其他存储后端(如S3)相比,它的性能相当差。看一下这个问题:在数据库mysql中保存图像
您的方法将导致数据在进入客户端之前经过DB, php和web服务器。而将它直接保存在文件系统中,并在数据库中保持对文件的引用,将允许您在请求时直接通过web服务器发送它。
正确的方法是在保存文件引用的应用程序中有一个表,例如我们称之为file_storage
。然后根据需要关联行:以"用户1:1头像"、"用户1:n照片"、"照片n:n图库"为例。这是DRY,维护SoC,甚至允许我在不同的后端存储文件。你也可以阅读CakePHP插件的文档,它的功能和我刚才描述的完全一样。
use Imagine'Image'Box;
use Imagine'Image'Point;
$image->resize(new Box(15, 25))
->rotate(45)
->crop(new Point(0, 0), new Box(45, 45))
->save('/path/to/new/image.jpg');
您应该首先将图像资源转换为字符串(通过将输出缓冲为变量),然后将其保存到数据库中,如下所示:
// ... your previous code
$rotate = imagerotate($source,$degrees,0);
// New code starts here
ob_start();
imagejpeg($rotate);
$imageData = ob_get_clean();
$image =$myClass->query("update tblImage set document='".base64_encode($imageData)."' where code=1");
注意,这必须在向客户端发送任何输出之前完成,否则ob_start()将失败。