将标题设置为CakePHP中的内容图像

时间:2011-08-25 22:51:39

标签: cakephp

我正在控制器中编写一个动作,在某种情况下,我想直接输出原始图像数据,并希望设置适当的标题内容类型。但是我认为CakePHP早先已经设置了标题(我将render设置为false)。

有没有办法解决这个问题?谢谢!

3 个答案:

答案 0 :(得分:1)

它不是$this->render(false),它是$this->autoRender=false;除非你回应一些东西,否则不会在控制器动作中发送标题。

答案 1 :(得分:1)

如前所述,当renderfalse时,CakePHP不会发送标头。请注意,执行“echo”的任何代码都会发送标头(除了您正在使用输出缓冲)。这包括来自PHP的消息(警告等)。

发送文件可以通过多种方式完成,但有两种基本方法:

使用普通PHP发送文件

function send_file_using_plain_php($filename) {
    // Avoids hard to understand error-messages
    if (!file_exists($filename)) {
        throw RuntimeException("File $filename not found");
    }

    $fileinfo = new finfo(FILEINFO_MIME);
    $mime_type = $fileinfo->file($filename); 
    // The function above also returns the charset, if you don't want that:
    $mime_type = reset(explode(";", $mime_type));
    // gets last element of an array

    header("Content-Type: $mime_type");
    header("Content-Length: ".filesize($filename));
    readfile($filename);
}

使用X-Sendfile并让Web服务器提供文件

// This was only tested with nginx

function send_file_using_x_sendfile($filename) {
    // Avoids hard to understand error-messages
    if (!file_exists($filename)) {
        throw RuntimeException("File $filename not found");
    }

    $fileinfo = new finfo(FILEINFO_MIME);
    $mime_type = $fileinfo->file($filename); 
    // The function above also returns the charset, if you don't want that:
    $mime_type = reset(explode(";", $mime_type));
    // gets last element of an array

    header("Content-Type: $mime_type");
    // The slash makes it absolute (to the document root of your server)
    // For apache and lighttp use:
    header("X-Sendfile: /$filename");
    // or for nginx: header("X-Accel-Redirect: /$filename");

}

第一个函数在发送数据时占用一个PHP进程/线程,并且不支持Range-Requests或其他高级HTTP功能。因此,这应仅用于小文件或非常小的站点。

使用X-Sendfile可以获得所有这些,但您需要知道正在运行的Web服务器,甚至可能需要更改配置。特别是在使用lighttp或nginx时,这确实可以带来性能,因为这些Web服务器非常擅长从磁盘提供静态文件。

这两个函数都支持不在Web服务器的document-root中的文件。在nginx中有所谓的“内部位置”(http://wiki.nginx.org/HttpCoreModule#internal)。这些可以与X-Accel-Redirect - 标题一起使用。即使是速率节流也是可能的,请看http://wiki.nginx.org/XSendfile

如果使用apache,则有mod_xsendfile,它实现了第二个函数所需的功能。

答案 2 :(得分:0)

如果render为false,则cake不会发送标题。

你可以在这里依赖普通的'php。

PNG:

header('Content-Type: image/gif');
readfile('path/to/myimage.gif');

JPEG:

header('Content-Type: image/jpeg');
readfile('path/to/myimage.jpg');

PNG:

header('Content-Type: image/png');
readfile('path/to/myimage.png');