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

  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

  7. #7
    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 patouche Voir le message
    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
    Salut Patouche,

    $this->getResponse()->canSendHeader() ==> true

    Maintenant j'ai donc :
    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
    <?php
     
    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()->clearHeaders();
    		$this->getResponse()->setHeader('Content-Type', 'image/jpg',true);
    		$this->getResponse()->setHeader('Cache-Control', 'public');
    		$this->getResponse()->setBody($image); 
    		$this->getResponse()->outputBody();
        }
    }
    Me renvoi l'url du controller pour firefox : http://localhost/test/image/image
    et pour ie j'ai le content de l'image.

    Ma réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Date	Tue, 29 Jun 2010 09:07:23 GMT
    Server	Apache/2.2.11 (Win32) PHP/5.3.0
    X-Powered-By	PHP/5.3.0
    Expires	Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control	no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public
    Pragma	no-cache
    Keep-Alive	timeout=5, max=100
    Connection	Keep-Alive
    Transfer-Encoding	chunked
    Content-Type	image/jpg
    Toujours pas d'image en vue.......:s, la question est : pourquoi ca marche dans un bête fichier php mais pas dans une action ?..........

  8. #8
    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
    n'utilise pas outputBody (autant pour moi). Il ne retourne pas les headers. Utiliser plutôt sendResponse qui lui renvoie les headers comme il se doit et ressort le body.

    Donc, la même chose sauf que tu remplaces la méthode outputBody.


    Cordialement,
    Patouche

  9. #9
    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 patouche Voir le message
    n'utilise pas outputBody (autant pour moi). Il ne retourne pas les headers. Utiliser plutôt sendResponse qui lui renvoie les headers comme il se doit et ressort le body.

    Donc, la même chose sauf que tu remplaces la méthode outputBody.


    Cordialement,
    Patouche
    Même résultat, je ne pense pas que se soit un problème des header parce que la réponse contient bien "content-type:image/jpg"

  10. #10
    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
    Quel est le contenu de $image ?? Fais un var_dump($image);

    Peut être aussi as tu levé des exceptions...
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($this->getResponse()->isException());

    et fais aussi un var_dump de ton body :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getResponse()->outputBody();

    Après je suis à cours d'idée...

  11. #11
    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 patouche Voir le message
    Quel est le contenu de $image ?? Fais un var_dump($image);

    Peut être aussi as tu levé des exceptions...
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($this->getResponse()->isException());

    et fais aussi un var_dump de ton body :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getResponse()->outputBody();

    Après je suis à cours d'idée...
    Yop,

    Euuhhh j'ai jamais utilisé var_dump mais il me renvoi rien quand je veux l'afficher dans mes logs (même pour un bête tableau).

    Après en regardant le contenu :
    $image = plein de caractère spéciaux (le content)
    $this->getResponse()->isException() = false
    $this->getResponse()->outputBody() = vide (mais bon cette fonction ne renvoi rien si ? le getBody contient bien le contenu de l'image)

    Sur un autre forum quelqu'un a testé mon bout de code dans un projet vide et il m'a dis que pour lui ca marche, je pense que je dois faire une bêtise au niveau de la config de zend ou qqch du genre mais qui n'a rien à voir avec ce controller.

    Sinon mon but principal est en fait d'afficher une image provenant d'un blob, quelqu'un a-t-il un exemple ? Et je voudrais bêtement appelé l'action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="image/image" />
    Autre question : Existe-t-il un soft qui permet de vérifier/corriger une image ? Je reste persuadé que du code est rajouté au content de mon image la rendant invalide....si je peux savoir quoi je pourrais trouver mon erreur ^^

  12. #12
    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
    Bon, je viens à mon tour de tester.


    J'ai la même chose que toi : L'url que j'ai passer et en allant regardé la réponse, j'ai le message et les headers, j'ai pu voir "The resource from this URL is not text: http://zend.fw.localhost/image"....


    Donc vraiment aucune idéé de comment régler ça ni d'où ça vient...


    Bon courage

  13. #13
    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
    A l'aide du soft Beyond compare, j'ai fait une comparaison des 2 fichiers images en hexa (l'original et celui généré) et 2 différences :
    1er ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    celui généré : 0D 0A 47 49 .......
    le bon fichier  :        47 49 .......
    dernière ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    celui généré : ..... 35 20
    le bon fichier  : ....... 35 20 00 3B
    Une partie à donc été rajouté au début et une partie a été retiré à la fin qui fait que le fichier n'est pas valide sinon tout est exactement pareil.....à quoi cela peut-il correspondre ?

    J'ai changer le code hexa du fichier généré et maintenant je peux l'ouvrir !!!! pourquoi le content est-il changé quand on passe par une action.....

  14. #14
    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 Résolu
    Résolu........c'était bien une bêtise, je n'utilisais déjà pas les "end tag" mais je n'avais pas enlevé des lignes vides dans le bootstraap, index & helpers.......Ca marche maintenant.....

    Merci pour votre aide !

+ 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