Есть ли способ заставить контроллер Codeigniter вернуть изображение? - PullRequest
10 голосов
/ 16 декабря 2009

Мне было интересно, есть ли способ для контроллера вместо возврата строки или представления вернуть изображение (будь то JPG, PNG и т. Д.). Например, вместо окончания $ this-> load-> view ('folder / special_view.php) я бы хотел сделать что-то вроде $ this-> load-> image (' images / gorilla.png ') и сделайте так, чтобы, если бы мой пользователь пошел к этому контроллеру, он увидел бы изображение, как если бы он перешел на обычный .png или jpeg. Могу ли я установить заголовки, чтобы они ожидали другого MIME? Пример кода этого будет фантастическим.

Мне потребовалось бы целую вечность, чтобы объяснить, почему я нуждаюсь в этом, но это включает в себя введение готовой CMS в codeigniter, и для этого нужны определенные вещи, чтобы быть правдой. Большое вам спасибо!

Ответы [ 7 ]

23 голосов
/ 16 декабря 2009

уверен, что можете, используйте это вместо $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
}
13 голосов
/ 16 декабря 2009

Это не предназначено как One-upmanship, но предложение 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-типа для использования других типов изображений

$this->load->image('/path/to/images/gorilla.jpg', 'image/jpeg');

Вернуть изображение

$image = $this->load->image('/path/to/images/gorilla.php', TRUE);

Точно так же, как $ this-> load-> view, третий параметр, установленный в TRUE, означает, что он вернется вместо непосредственного вывода.

Надеюсь, это поможет: -)

11 голосов
/ 11 октября 2012

Более простой способ с автоматическим типом пантомимы.

$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));
2 голосов
/ 10 февраля 2011

О коде Фила:

В 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();

В обоих случаях вы получаете одно и то же изображение, которое вы получаете от источника, но на выходе.

Но мне больше понравилось расширение базовой библиотеки: -)

Большое спасибо, Фил.

1 голос
/ 06 декабря 2012

Я бы сделал

$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));

Если это поможет. Ура! * * 1004

1 голос
/ 13 марта 2012

Если он соответствует вашему варианту использования, просто перенаправить на него просто отлично. Например, отслеживание с использованием изображений будет выглядеть так:

// Do your logic here

redirect($image_path); // Or PHP's header location function

Нет необходимости менять заголовки. Ваш вариант использования может не соответствовать этому, но кто-то может найти это полезным ^ _ ^

0 голосов
/ 07 февраля 2012

Этот метод работает, даже если для $ 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);
}
...