我正在尝试使用Cake PHP中的GD lib创建缩略图。
我可以将调整大小的缩略图写入tmp目录,并创建合理的URL以显示tmp目录中的图像:
//set up empty GD resource
$tmp = imagecreatetruecolor(200*$iw/$ih, 200);
//create thumbnail image in the empty GD resource
imagecopyresampled($tmp, $src, 0, 0, 0, 0,200*$iw/$ih, 200, $iw, $ih);
//build full path to thumbnail in the cakephp tmp directory
$thumbfile = APP.'tmp/thumb.jpg';
//build URL path to the same thumbnail
$thumblink = $this->webroot.'tmp/thumb.jpg';
//write jpeg to the tmp directory
$return=imagejpeg($tmp,$thumbfile);
//write out the image to client browser
echo "<img=\"$thumblink\" alt=\"thumb\" height=\"200\" width=\"200*$iw/$ih\">";
缩略图被创建并写入tmp目录,但是当我尝试访问URL时,我收到以下错误消息:
Error: TmpController could not be found.
Error: Create the class TmpController below in file: app/Controller/TmpController.php
显然我有路由错误 - Cake尝试调用tmp控制器,而不是查看tmp direcectory。我该如何解决这个问题,或者是否有其他方法可以使用GD lib来提供临时缩略图? 我计划为每个会话或用户创建唯一的缩略图,但我需要先使用它。
Config / routes.php中的路由:
Router::connect('/', array('controller' => 'MsCake', 'action' => 'index'));
Router::connect('/pages/*', array('controller' => 'pages'));
CakePlugin::routes();
我查看了ThumbnailHelper,但是没有使用GD Lib。我还需要能够从外部访问存储在非apache可访问目录中的文件,但我甚至无法访问任何临时符号链接来访问它们。例如
...我得到与上面相同的错误 - 错误:无法找到TmpController。
答案 0 :(得分:4)
如果你做了任何事情来使tmp目录中的文件可以通过网络访问 - 那么你的网站安全性会严重下降。 tmp目录中的内容永远不应该是Web可访问的。
更好的想法是将您的临时图像放在webroot目录中 - 这是唯一通常可通过Web访问的目录。例如:
$filename = md5($userId);
$thumbfile = APP.'webroot/img/cache/' . $filename . '.jpg';
...
$url = '/img/cache/' . $filename . '.jpg';
或者,使用media view class路由到控制器操作以处理请求。但是要注意,使用php提供图像并不是免费的 - 处理请求时可能会有明显的延迟 - 指向静态文件的地方没有这个成本/风险,因为它只是网络服务器负责服务内容。
答案 1 :(得分:0)
由于它是临时的,你可以做的是将图像显示为数据网址而不是tmp目录,如下所示(从imagecopyresampled()
调用后替换):
ob_start();
imagepng($tmp);
$contents = ob_get_contents();
ob_end_clean();
imagedestroy($tmp);
//write out the image to client browser
echo "<img src='data:image/png;base64,".base64_encode($contents)."' alt='thumb' height='200' width='".(200*$iw/$ih)."'>";
由于图像是base64编码而不是以二进制形式发送,因此使用更多带宽。