2009-12-15 4 views
9

Mi chiedevo se c'era un modo per un controller per, invece di restituire una stringa, o una vista, restituire un'immagine (sia JPG, PNG ecc.). Ad esempio, invece di finire con $ this-> load-> view ('folder/special_view.php), mi piacerebbe fare qualcosa come $ this-> load-> image (' images/gorilla.png ') , e averlo così se il mio utente dovesse andare su quel controller, vedrebbe un'immagine come se fosse andata a un normale .png o jpeg. Posso impostare le intestazioni in modo che si aspetti un MIME diverso? Il codice di esempio di questo sarebbe fantastico.C'è un modo per avere un controller Codeigniter per restituire un'immagine?

Mi ci vorrà un'eternità per spiegare perché ne ho bisogno, ma implica il portare un CMS premeditato in codeigniter e avere bisogno che le cose siano sicure per essere vero. Grazie mille!

risposta

20

sicuro che si può, usare questo invece di $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 
} 
+0

Funziona perfettamente, grazie! – Ethan

+0

Sto lavorando alla versione corrente di Codeigniter. questo codice non funziona per me –

+0

Immagino che il comando 'exit' non abbia scopo, dal momento che' die' termina lo script e fanno lo stesso lavoro comunque. Grazie per il codice, a proposito. –

13

Questo non è inteso come un'esagerazione, ma il suggerimento di pǝlɐɥʞ è un'implementazione pura PHP che non è poi così riutilizzabile. Volevi usare la sintassi $ this-> load-> image ('images/gorilla.png') ecco come puoi.

Crea /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 
    } 

Ci sono alcuni modi è possibile utilizzare questo:

uscita di base (di default è JPEG)

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

Invia mime-type per utilizzare altri tipi di immagini

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

riportare l'immagine

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

Proprio come $ this-> load-> vista, il 3 ° parametro che viene impostato su TRUE significa che tornerà invece di mandare in output.

Spero che questo aiuti :-)

+0

Eeeek !!! grazie! – Ethan

+0

La biblioteca deve essere in application/core/MY_Loader.php –

+0

@GauravGupta sì, se si utilizza 2.0 o versione successiva, allora è necessario essere in 'core /' 'non le librerie /'. 2.0 non esisteva nel 2009. :) –

2

A proposito di codice di Phil:

In CodeIgniter 2.0, oggi, ci sono un un cambiamento che deve essere fatto al fine di farlo funzionare:

  • La biblioteca deve essere contenuto nel/applicazione/nucleo /MY_Loader.php

Mi piace sottolineare un piccolo errore di battitura sulla spiegazione della biblioteca:

  • C'è un errore nell'intestazione "uscita di base (di default è jpeg)" perché in realtà il valore predefinito è.png

Un altro soluzioni al problema sono:

Ho fatto un piccolo codice per farlo funzionare con le librerie di CodeIgniter fondamentali:

$this->output->set_header("Content-Type: image/png"); 
    $this->load->file('../images/example.png'); 

oppure utilizzando la libreria Image Manipulation

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

In entrambi i casi si ottiene la stessa immagine ottenuta dal fonte ma nell'output.

Ma per me, mi è piaciuta di più l'estensione alla libreria di base :-)

ringrazio molto Phil.

+0

Non ho mai notato il caricatore di file generico. Stavo passando attraverso il codice di CodeIgniter ... Grazie per averlo indicato .. Usando il meglio del codeigniter ... :) –

+0

Beh, un'altra cosa che ho notato era internamente la funzione di caricamento chiama la funzione include ... come da il manuale php che si dovrebbe usare include se è usato per l'elaborazione ... dovrebbe invece essere usata la funzione readfile ... quindi possiamo usare la funzione readfile fornita in File helper! –

0

Questo metodo funziona anche se si dispone di $ config [ 'compress_output'] impostata su 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); 
} 
1

Se si misura il vostro caso d'uso, semplicemente reindirizzando ad essa è proprio bene. Ad esempio, il monitoraggio utilizzando le immagini sarebbe come:

// Do your logic here 

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

Non è necessario modificare le intestazioni. Il tuo caso d'uso non può andare bene, ma qualcuno potrebbe trovare questo utile^_^

11

Un modo più semplice con automatica 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)); 
1

vorrei fare un

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

Se questo aiuta. Saluti!

Problemi correlati