有没有办法让Codeigniter控制器返回图像?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法让Codeigniter控制器返回图像?相关的知识,希望对你有一定的参考价值。
我想知道控制器是否有办法,而不是返回一个字符串,或一个视图,返回一个图像(无论是JPG,PNG等)。例如,我不想以$ this-> load-> view('folder / special_view.php)结尾,而是想做像$ this-> load-> image('images / gorilla.png')这样的事情。并且如果我的用户要去那个控制器他们会看到一个图像,好像他们去了正常的.png或jpeg。我可以设置标头,以便它需要不同的MIME吗?这个示例代码太棒了。
我需要永远解释为什么我需要这个,但它涉及将预制的CMS带入codeigniter,并让它需要真实的事情。非常感谢!
确定你可以使用这个代替$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
}
这不是一个上涨的目标,但是pǝlɐɥʞ的建议是一个纯粹的PHP实现,并不是所有可重用的。你想使用语法$ this-> load-> 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-> load-> view一样,第三个参数设置为TRUE意味着它将返回而不是直接输出。
希望这可以帮助 :-)
一种更简单的自动mime类型的方法。
$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));
关于Phil的代码:
在CodeIgniter 2.0中,今天必须进行一项更改才能使其工作:
- 该库必须位于/application/core/MY_Loader.php中
我想讲一下关于图书馆解释的一个小错字:
- 标题“基本输出(默认为jpeg)”中存在错误,因为实际上默认值为.png
该问题的另一个解决方案是:
我制作了一个小代码,使其与核心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。
如果它适合您的用例,只需重定向到它就好了。例如,使用图像进行跟踪就像:
// Do your logic here
redirect($image_path); // Or PHP's header location function
无需更改标题。您的用例可能不适合这个,但有人可能会发现这个有用^ _ ^
我会做的
$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));
如果这有帮助。干杯!
即使您将$ 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);
}
以上是关于有没有办法让Codeigniter控制器返回图像?的主要内容,如果未能解决你的问题,请参考以下文章
CodeIgniter 图像水印在使用动态输出时返回空白图像
Codeigniter上传:插入数据库时图像的文件名返回null