Существует ли способ иметь возврат контроллера Codeigniter изображение?

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

Это взяло бы навсегда, чтобы я объяснил, почему мне нужно это, но это включает обеспечение предварительно сделанного CMS в codeigniter, и для наличия его нужны certian вещи быть верным. Огромное спасибо!

10
задан Ethan 15 December 2009 в 23:04
поделиться

2 ответа

конечно можете, используйте это вместо $ 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
}
22
ответ дан 3 December 2019 в 13:27
поделиться

Это не предназначено как «одно превосходство», но предложение 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 означает, что он вернется вместо прямого вывода.

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

12
ответ дан 3 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: