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

Langage PHP Discussion :

Afficher une image avec header(..jpeg) et readfile en php [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre du Club Avatar de yuukuari
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 40
    Points
    40
    Par défaut Afficher une image avec header(..jpeg) et readfile en php
    Bonjour,

    Je voudrais afficher une image seulement à certains utilisateurs.
    Lorsqu'un internaute pense être redirigé vers http://www.monsite.com/images/image.jpg, un .htaccess redirige en fait vers un fichier php images.php à la racine de mon site.

    Dans ce fichier images.php, je récupère le user en session, je regarde s'il a bien le droit de visualiser l'image et si :
    - Il n'a pas le droit, je renvoie une page 404
    - Il a le droit, je lui affiche l'image en modifiant le header.

    Pour modifier le header et afficher l'image, je fais comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $path = 'path/to/myimage.jpg';
    header('Content-Type: image/jpeg');
    readfile($path);
    J'ai bien vérifié l'existence du fichier (file_exists), ses dimensions (getimagesize) et sa taille (filesize), tout est ok à ce niveau.

    Lorsque je retire la ligne header('Content-Type: image/jpeg');, je récupère bien le fichier mais non sous format jpeg.
    Dès que j'ajoute le header, j'obtiens l'erreur suivante, sous forme d'image :
    L'image "http://127.0.0.1/images/image.jpg" ne peut être affichée car elle contient des erreurs.

    J'ai beau parcourir le net à la recherche d'une solution, tout le monde arrive à afficher une image avec ce bout de script ... :/
    Ce qui est bizarre c'est que le header a l'air de fonctionner (j'ai bien une image en sortie, mais sous forme de texte d'erreur) et que readfile a l'air de bien lire l'image.
    J'ai aussi essayé avec d'autres images jpg que mon image de test ainsi qu'avec un png mais c'est la mm chose

    Merci de votre aide !

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 252
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 252
    Points : 8 542
    Points
    8 542
    Billets dans le blog
    17
    Par défaut
    Sûrement un caractère blanc avant le readfile qui corromp l'image.

    Dans un 1er temps fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //$path = 'path/to/myimage.jpg';
    //header('Content-Type: image/jpeg');
    //header('Content-Type: image/jpeg');
    //readfile($path);
    header('Content-Type: text/plain');
    exit("]<= Qu'y-a-t-il avant le crochet ?") ;
    ... et regarde la source HTML de la page générée.

  3. #3
    Membre du Club Avatar de yuukuari
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 40
    Points
    40
    Par défaut
    Salut,

    J'ai mis ces lignes et je ne vois aucun espace avant le crochet en question.

    Par contre, en continuant sur cette lignée, j'ai viré tout le code qu'il y avait avant le readfile et lorsque j'enlève 3 include (fichiers de constantes), ça fonctionne !

    Ça doit être une histoire d'espace ou autre caractère qui s'est ajouté, sauf qu'il n'y a aucun echo.. je vais regarder ça de plus près

    Merci beaucoup !

  4. #4
    Membre du Club Avatar de yuukuari
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 40
    Points
    40
    Par défaut
    Bon après avoir suivi 45 require_once et trouvé aucun espace (je m'attendais à en trouver avant un <?php ou quelque chose du genre), j'ai fini par trouver un fichier qui n'était pas encodé en UTF-8 (sans BOM), comme tous les autres, mais en UTF-8 tout court.

    Et après avoir changé le format, tout fonctionne ...
    "Le codage UTF-8 « standard », donc avec BOM (pour « Byte Order Mark ») rajoute un caractère en début de fichier. Un espace insécable de largeur nulle « zero-width no-break space ». Ce caractère est invisible pour l’utilisateur. En fait, ce caractère n’a pas d’intérêt en UTF-8. Il est utile en UTF-16 ou UTF-32."


    Merci pour ton aide et j'espère que ça servira à d'autres malheureux.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Enseignant chercheur retraitée
    Inscrit en
    Octobre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant chercheur retraitée

    Informations forums :
    Inscription : Octobre 2006
    Messages : 21
    Points : 19
    Points
    19
    Par défaut l'image ne peut être affichée car elle contient des erreurs
    Je me permet de soumettre ici mon problème car il me semble être assez semblable à celui de yuukuari.

    Voici deux versions d'un petit programme allant chercher uene image dans une BDD postgres. Ils ne diffèrent que par la ligne en rouge :
    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 header('Content-type:image/jpeg');
    $image_oid = 219109;
    $pgconn = "host=localhost  port=5432 dbname=images user=.. password=..";
    $database = pg_connect($pgconn);
    pg_query($database, "begin");
    $handle = pg_lo_open($database, $image_oid, "r");
    pg_lo_read_all($handle);
    pg_query($database, "commit");
    ?>
     
    <?php header('Content-type:image/jpeg');
    $image_oid = $_GET('OID');
    $pgconn = "host=localhost  port=5432 dbname=images user=.. password=..";
    $database = pg_connect($pgconn);
    pg_query($database, "begin");
    $handle = pg_lo_open($database, $image_oid, "r");
    pg_lo_read_all($handle);
    pg_query($database, "commit");
    ?>
    La première me renvoie l'image correctement
    La deuxième affiche:
    l'image ne peut être affichée car elle contient des erreurs

    Qu'est-ce qui cloche Docteur ???
    Merci!

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 252
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 252
    Points : 8 542
    Points
    8 542
    Billets dans le blog
    17
    Par défaut
    Débugage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    //header('Content-type:image/jpeg');
    $image_oid = $_GET('OID');
    $pgconn = "host=localhost  port=5432 dbname=images user=.. password=..";
    $database = pg_connect($pgconn);
    pg_query($database, "begin");
    $handle = pg_lo_open($database, $image_oid, "r");
    header('Content-type:text/plain');
    exit("]<= Ce qui pose problème à l'image") ;
    pg_lo_read_all($handle);
    pg_query($database, "commit");
    J'ai supprimé le ?> qui est inutile dans un script ne contenant que du PHP et qui peut parfois poser problème.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Enseignant chercheur retraitée
    Inscrit en
    Octobre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant chercheur retraitée

    Informations forums :
    Inscription : Octobre 2006
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Débugage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    //header('Content-type:image/jpeg');
    $image_oid = $_GET('OID');
    $pgconn = "host=localhost  port=5432 dbname=images user=.. password=..";
    $database = pg_connect($pgconn);
    pg_query($database, "begin");
    $handle = pg_lo_open($database, $image_oid, "r");
    header('Content-type:text/plain');
    exit("]<= Ce qui pose problème à l'image") ;
    pg_lo_read_all($handle);
    pg_query($database, "commit");
    J'ai supprimé le ?> qui est inutile dans un script ne contenant que du PHP et qui peut parfois poser problème.


    J'ai, je crois, compris le déplacement du header mais... pas le commentaire du exit.


    Par ailleurs , l'execution corrigée sort du nouveau :

    script lancé par : get_image.php?OID=219911

    Fatal error: Function name must be a string in G:\www\tests\get_image.php on line 2

    Suis-je importune ?

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 252
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 252
    Points : 8 542
    Points
    8 542
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par jobern Voir le message
    J'ai, je crois, compris le déplacement du header mais... pas le commentaire du exit.
    Même principe que mon 1er message dans cette discussion ;-)

    Par ailleurs , l'execution corrigée sort du nouveau :

    script lancé par : get_image.php?OID=219911

    Fatal error: Function name must be a string in G:\www\tests\get_image.php on line 2
    Voilà, donc la navigateur se retrouve avec une image à afficher "Fatal error: Function name must be a string in G:\www\tests\get_image.php on line 2(données de l'image)", ce qui explique pourquoi il te signale qu'elle est invalide.
    Il ne te reste plus qu'à corriger cette erreur PHP

  9. #9
    Membre à l'essai
    Femme Profil pro
    Enseignant chercheur retraitée
    Inscrit en
    Octobre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant chercheur retraitée

    Informations forums :
    Inscription : Octobre 2006
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Même principe que mon 1er message dans cette discussion ;-)


    Voilà, donc la navigateur se retrouve avec une image à afficher "Fatal error: Function name must be a string in G:\www\tests\get_image.php on line 2(données de l'image)", ce qui explique pourquoi il te signale qu'elle est invalide.
    Il ne te reste plus qu'à corriger cette erreur PHP
    Merci Beaucoup.

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

Discussions similaires

  1. Afficher une image avec PHP
    Par a_zouggari dans le forum Langage
    Réponses: 2
    Dernier message: 22/04/2006, 18h02
  2. Afficher une image avec opengl
    Par kmaniche dans le forum OpenGL
    Réponses: 4
    Dernier message: 07/02/2006, 09h04
  3. Afficher une image avec swing
    Par arnonote dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 07/08/2004, 12h10
  4. PL/SQL - Comment afficher une image avec HTP ?
    Par patmaba dans le forum PL/SQL
    Réponses: 2
    Dernier message: 08/07/2004, 09h28

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