IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

Retour d'une image avec une action


Sujet :

MVC PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Retour d'une image avec une action
    Salut tout le monde,

    Je cherche depuis quelque temps comment je peux retourner le contenu d'une image via une action :

    Ma page HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="user/loadavatar" />
    Mon action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class ImageController extends Zend_Controller_Action 
    {
     
        function imageAction()
        {
    	$this->_helper->layout->disableLayout();
            $this->_helper->viewRenderer->setNoRender();
     
        	$image = file_get_contents("test.png");
     
    	$this->getResponse()->clearBody ();
    	$this->getResponse()->setHeader('Content-Type', 'image/png');
    	$this->getResponse()->setBody($image); 
        }
    }
    Quand j'appel l'action de mon controller : http://localhost/skybook/image/image
    -> Firefox m'affiche : "L'image ne peut être affichée car elle contient des erreurs"

    En essayant bêtement de mettre dans un simple test.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    header("Content-Type: image/png");
    echo file_get_contents('test.png');
    ?>
    L'image s'affiche correctement....par contre si je met ce code dans une vue appelée par une action (contenant juste la désactivation du layout) j'ai la même erreur....

    J'ai l'impression que quelque chose est rajouté au contenu de l'image quand j'essaye via une action.......

    Help !!!

    Jo

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    essaye de rajouter un die() juste après l'envoi de l'image.

    Sinon tu peux essayer avec readfile() plutot que file_get_contents()
    http://www.php.net/manual/fr/function.readfile.php
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Seb33300 Voir le message
    essaye de rajouter un die() juste après l'envoi de l'image.

    Sinon tu peux essayer avec readfile() plutot que file_get_contents()
    http://www.php.net/manual/fr/function.readfile.php
    die() -> page blanche
    readfile -> page = contenu de l'image (avec plein de caractère bizard ^^)

    :s :s

  4. #4
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Le "die()" tu l'a bien placé apres le "$this->getResponse()->setBody($image);" ?

    Et pour le readfile() tu as bien mis les header comme dans l'exemple du lien ?
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Seb33300 Voir le message
    Le "die()" tu l'a bien placé apres le "$this->getResponse()->setBody($image);" ?

    Et pour le readfile() tu as bien mis les header comme dans l'exemple du lien ?
    Avec die -> page blanche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    class ImageController extends Zend_Controller_Action 
    {
     
        function imageAction()
        {
    		$this->_helper->layout->disableLayout();
    	        $this->_helper->viewRenderer->setNoRender();
     
    		$image = file_get_contents("test.jpg");
     
    		$this->getResponse()->clearBody ();
    		$this->getResponse()->setHeader('Content-Type', 'image/jpg');
    		$this->getResponse()->setHeader('Cache-Control', 'public');
    		$this->getResponse()->setBody($image); 
    		die();
        }
    }
    Avec readfile (exemple brut) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    class ImageController extends Zend_Controller_Action 
    {
     
        function imageAction()
        {
    		$this->_helper->layout->disableLayout();
    	    $this->_helper->viewRenderer->setNoRender();
     
       		 $file = 'test.jpg';
     
    		if (file_exists($file)) {
    		    header('Content-Description: File Transfer');
    		    header('Content-Type: application/octet-stream');
    		    header('Content-Disposition: attachment; filename='.basename($file));
    		    header('Content-Transfer-Encoding: binary');
    		    header('Expires: 0');
    		    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    		    header('Pragma: public');
    		    header('Content-Length: ' . filesize($file));
    		    ob_clean();
    		    flush();
    		    readfile($file);
    		    exit;
    		}
        }
    }
    Il me propose de le télécharger mais impossible de voir l'image. Le fichier a une taille identique à celui d'origine....

    Si je test ce code dans un bete fichier test.php ca marche mais dés que je passe pas une action le fichier n'est pas valid......

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Si on reprend de plus haut ton code dans ton controller :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Regarde dans un premier temps si tu peux envoyer tes headers.
    var_dump($this->getResponse()->canSendHeader()); // Si true, c'est ok
     
    // Je crois qu'il est possible de rajouter un 3ième arguments qui correspond à $replace.
    //en tout cas, dans la fonction header c'est possible et c'est ce qui permet d'écraser ce qui précède.
    $this->getResponse()->setHeader('Content-Type', 'image/jpg', true);
     
    $this->getResponse()->setBody($image);

    Et ensuite je sais pas ou tu fais le rendu de ta réponse, mais tu peux essayer si tu le souhaites directement dans ton controller en faisant un output();


    Cordialement,
    Patouche

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [Débutant] Manipulation d'images : intégrer une image dans une image
    Par noscollections dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2014, 11h51
  3. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  4. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  5. Insérer une légende dans une image avec une police plus petite
    Par Paulinho dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 29/04/2006, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo