1

我有一个 cakephp 应用程序。我知道我的应用程序使用 default.ctp 作为其布局。在默认布局中,我的标题设置为 html/text。我想将标题类型更改为 image/png。我应该在哪里更改它?请有人帮助我

代码:

$this->layout=NULL; 
$this->autoRender=false; 
$this->RequestHandler->respondAs('image/jpg');

      View Coding :(index.ctp)
           <?php 
           session_start(); 
           $text = rand(10000,99999); 
           $_SESSION["vercode"] = $text; 
           $height = 25; 
           $width = 65; 

           $image_p = imagecreate($width, $height); 
           $black = imagecolorallocate($image_p, 0, 0, 0); 
            $white = imagecolorallocate($image_p, 255, 255, 255); 
            $font_size = 14; 
            imagestring($image_p, $font_size, 5, 5, $text, $white); 
            imagejpeg($image_p, null, 80); 
                  ?>
           Controller coding :

                public function index() 
                {
                      $this->layout=false;
                      $this->response->type('png');
                } 

注意:CakePHP 版本 2.3.0

4

3 回答 3

2

使用 CakePHP 3

您应该始终尝试使用 CakePHP 的方式,而不是使用 PHP 的 header() 函数手动设置标题。在这种情况下,文档不是很清楚。我必须弄清楚。

这就是我使用 CakePHP 3.3 使其工作的方式:

  • 首先,将图像的内容放入一个变量中,因为我们希望 CakePHP 渲染该内容,而不仅仅是输出和死亡。

  • 然后销毁图像资源以释放内存。

  • 可选:您可以设置缓存标头。(在下面的代码中注释)

  • 将响应对象类型设置为“jpg”或“png”等。参见文档

  • 将布局设置为:“ false

  • 将图像输出到响应正文并将 autoRender 设置为 false 以避免创建不必要的模板文件 (.ctp)。

// Controller method
public function image($id = null) {
    // Create an image resource: $image ...
    ob_start();
    imagejpeg($image);
    $buffer = ob_get_clean();
    imagedestroy($image);

    // $this->response->cache('-1 minute', '+1 days');
    $this->response->type('jpg');
    $this->viewBuilder()->layout(false);
    $this->response->body($buffer);
    $this->autoRender = false;
}
于 2016-11-29T05:40:24.867 回答
1

如果您真的必须将视图/布局的内容作为图像返回(我非常怀疑):

$this->response->type('png'); // as documented in the 2.x docs

将自动设置image/png为标头的响应类型。

如果您需要在没有布局的情况下渲染视图,请尝试

$this->layout = false;
// OR
$this->render('my_view', false); // false should not render a layout

您不能使用“null”,因为它呈现默认布局。

无论哪种方式,永远不要在你的视图中调用 header() 东西,总是通过响应对象在你的控制器中。

于 2013-02-25T10:06:13.867 回答
-1

(是的,旧线程,但我刚刚遇到了这个问题。)

$this->autoRender = false;
header('Content-Type: image/png');

控制器的方法对我有用。

于 2016-07-29T18:25:34.650 回答