有没有办法让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

在 iPhone 上另存为图像

Codeigniter CSRF 问题

codeigniter 从控制器返回获取数据以通过 Ajax 请求查看

在 codeigniter 中使用控制器中的 readfile() 显示图像