我想知道控制器是否有办法,而不是返回字符串或视图,返回图像(无论是JPG,PNG等)。例如,我不想以$ this-> load->视图('folder / special_view.php)结尾,而是想做像$ this-> load-> image('images / gorilla)这样的事情。 .png'),并且如果我的用户要去那个控制器他们会看到一个图像,好像他们去了正常的.png或jpeg。我可以设置标头,以便它需要不同的MIME吗?这个代码示例很棒。
我需要永远解释为什么我需要这个,但它涉及将预制的CMS带入codeigniter,并让它需要认证的事情。非常感谢你!
答案 0 :(得分:22)
确定可以使用此代替$this->load->view()
$filename="/path/to/file.jpg"; //<-- specify the image file
if(file_exists($filename)){
$mime = mime_content_type($filename); //<-- detect file type
header('Content-Length: '.filesize($filename)); //<-- sends filesize header
header("Content-Type: $mime"); //<-- send mime-type header
header('Content-Disposition: inline; filename="'.$filename.'";'); //<-- sends filename header
readfile($filename); //<--reads and outputs the file onto the output buffer
die(); //<--cleanup
exit; //and exit
}
答案 1 :(得分:13)
这不是一次性的,但pǝlɐɥʞ的建议是一个纯粹的PHP实现,并不是所有可重用的。你想使用语法$ this-&gt; load-&gt; image('images / gorilla.png'),所以你可以这样做。
创建/application/libraries/MY_Loader.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Loader Class
*
* Loads views and files
*
* @package CodeIgniter
* @subpackage Libraries
* @author Phil Sturgeon
* @category Loader
* @link http://codeigniter.com/user_guide/libraries/loader.html
*/
class MY_Loader extends CI_Loader {
function image($file_path, $mime_type_or_return = 'image/png')
{
$this->helper('file');
$image_content = read_file($file_path);
// Image was not found
if($image_content === FALSE)
{
show_error('Image "'.$file_path.'" could not be found.');
return FALSE;
}
// Return the image or output it?
if($mime_type_or_return === TRUE)
{
return $image_content;
}
header('Content-Length: '.strlen($image_content)); // sends filesize header
header('Content-Type: '.$mime_type_or_return); // send mime-type header
header('Content-Disposition: inline; filename="'.basename($file_path).'";'); // sends filename header
exit($image_content); // reads and outputs the file onto the output buffer
}
有几种方法可以使用它:
基本输出(默认为jpeg)
$this->load->image('/path/to/images/gorilla.png');
发送mime-type以使用其他图像类型
$this->load->image('/path/to/images/gorilla.jpg', 'image/jpeg');
返回图片
$image = $this->load->image('/path/to/images/gorilla.php', TRUE);
就像$ this-&gt; load-&gt;视图一样,第三个参数设置为TRUE意味着它将返回而不是直接输出。
希望这会有所帮助: - )
答案 2 :(得分:11)
使用自动mime-type更简单的方法。
$this->load->helper('file');
$image_path = '/path/to/image/file';
$this->output->set_content_type(get_mime_by_extension($image_path));
$this->output->set_output(file_get_contents($image_path));
答案 3 :(得分:2)
关于Phil的代码:
在CodeIgniter 2.0中,今天必须进行一项更改才能使其正常工作:
我想谈一下关于图书馆解释的小错误:
该问题的另一个解决方案是:
我已经制作了一个小代码,以使其与核心codeIgniter库一起使用:
$this->output->set_header("Content-Type: image/png");
$this->load->file('../images/example.png');
或使用图像处理库
$config['image_library'] = "GD2";
$config['source_image'] = "../images/example.png";
$config['maintain_ratio'] = TRUE;
$config['dynamic_output'] = TRUE;
$this->load->library('image_lib', $config);
$image = $this->image_lib->resize();
在这两种情况下,您都可以获得与源相同但在输出中的相同图像。
但对我来说,我更喜欢核心库的扩展: - )
非常感谢Phil。
答案 4 :(得分:1)
如果它适合您的使用案例,只需重定向到它就好了。例如,使用图像进行跟踪就像:
// Do your logic here
redirect($image_path); // Or PHP's header location function
无需更改标题。您的用例可能不适合这种情况,但有人可能会发现这个有用^ _ ^
答案 5 :(得分:1)
我会做一个
$computedImage = 'path/to/the/image.ext';
$this->load->helper('file');
$this->output->set_content_type(get_mime_by_extension($computedImage))->set_output(file_get_contents($computedImage));
如果这有帮助。干杯!
答案 6 :(得分:0)
即使您将$ config ['compress_output']设置为TRUE
,此方法仍然有效$filename="/path/to/file.jpg"; //<-- specify the image file
if(file_exists($filename)){
header('Content-Length: '.filesize($filename])); //<-- sends filesize header
header('Content-Type: image/jpg'); //<-- send mime-type header
header('Content-Disposition: inline; filename="'.$filename.'";'); //<-- sends filename header
$jpg = file_get_contents($filename);
$this->output->set_output($jpg);
}