Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/05/2011, 16h03   #1
Futur Membre du Club
 
Avatar de yuukuari
 
Homme
Inscription : mai 2007
Messages : 65
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2007
Messages : 65
Points : 15
Points : 15
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 :
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 !
yuukuari est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 18h17   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 449
Points : 3 449
Sûrement un caractère blanc avant le readfile qui corromp l'image.

Dans un 1er temps fais :

Code :
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.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 19h08   #3
Futur Membre du Club
 
Avatar de yuukuari
 
Homme
Inscription : mai 2007
Messages : 65
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2007
Messages : 65
Points : 15
Points : 15
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 !
yuukuari est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 19h42   #4
Futur Membre du Club
 
Avatar de yuukuari
 
Homme
Inscription : mai 2007
Messages : 65
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2007
Messages : 65
Points : 15
Points : 15
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 ...
Citation:
"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.
yuukuari est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 08h50   #5
Candidat au titre de Membre du Club
 
Webmaster
Inscription : octobre 2006
Messages : 21
Détails du profil
Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : octobre 2006
Messages : 21
Points : 12
Points : 12
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 :
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!
jobern est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 10h07   #6
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 449
Points : 3 449
Débugage :

Code :
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.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h41   #7
Candidat au titre de Membre du Club
 
Webmaster
Inscription : octobre 2006
Messages : 21
Détails du profil
Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : octobre 2006
Messages : 21
Points : 12
Points : 12
Citation:
Envoyé par Séb. Voir le message
Débugage :

Code :
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 ?
jobern est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h51   #8
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 449
Points : 3 449
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 ;-)

Citation:
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
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h56   #9
Candidat au titre de Membre du Club
 
Webmaster
Inscription : octobre 2006
Messages : 21
Détails du profil
Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : octobre 2006
Messages : 21
Points : 12
Points : 12
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.
jobern est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h14.


 
 
 
 
Partenaires

Hébergement Web