我正在控制器中编写一个动作,在某种情况下,我想直接输出原始图像数据,并希望设置适当的标题内容类型。但是我认为CakePHP早先已经设置了标题(我将render设置为false)。
有没有办法解决这个问题?谢谢!
答案 0 :(得分:1)
它不是$this->render(false)
,它是$this->autoRender=false;
除非你回应一些东西,否则不会在控制器动作中发送标题。
答案 1 :(得分:1)
如前所述,当render
为false
时,CakePHP不会发送标头。请注意,执行“echo”的任何代码都会发送标头(除了您正在使用输出缓冲)。这包括来自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);
}
// 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');