Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
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 14/08/2007, 16h01   #1
Membre actif
 
Avatar de Lordsephiroth
 
Patrick Mingard
Inscription : mai 2006
Messages : 166
Détails du profil
Informations personnelles :
Nom : Patrick Mingard
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 166
Points : 185
Points : 185
Par défaut Affichage par PHP d'une image se trouvant dans la base de données

Hello,

J'ai actuellement un petit problème avec un script de gestion d'image en PHP. L'idée est d'associer un avatar à chaque utilisateur du site (rien de nouveau). L'image est enregistrée dans un champ de type "longblob" de la base de donnée MySQL associée (pourquoi dans la BD et non dans un fichier? simplement pour éviter que si par hasard l'identificateur de l'utilisateur change, l'image soit ensuite invalide).

L'enregistrement de l'image se fait sans problème. Mon script qui renvoie l'image ressemble à :

Code :
1
2
3
 
$image = // recherche dans la base de données du champ de type longblob
echo $image;
Ce simple code, si l'image est appelée depuis un code HTML, donne un affichage correct.

Afin de permettre aux gens de faire clic droit sur l'image -> "Afficher l'image", j'ai modifié mon code comme suit :

Code :
1
2
3
4
 
$image = // recherche dans la base de données du champ de type longblob
header('Content-type: image/jpeg');
echo $image;
Cette façon de faire marche très bien pour un affichage dans le navigateur (que l'image soit d'ailleurs ou non en format JPG, mais là n'est pas le débat).

L'étape suivante est de permettre aux utilisateurs de pouvoir télécharger l'image par un clic droit -> "Enregistrer l'image sous...". Par contre, cette fonctionnalité ne marche pas avec le code que j'ai mis juste au dessus si le cache est désactivé (ça marche si le cache du browser est activé). Le fichier téléchargé est un fichier d'image, correct d'ailleurs, mais qui porte le nom de mon script PHP (et une extension .PHP, ce qui est génant).

C'est un peu génant pour l'utilisateur de devoir modifier l'extension d'un fichier .PHP en .JPG pour pouvoir ensuite visualiser en local l'image (et la plupart des utilisateurs ne penseraient d'ailleurs pas à le faire, ce qui est tout à fait normal).

php.net propose un morceau de code ressemblant à :

Code :
1
2
3
4
5
 
header('Content-type: image/jpeg;'); // This should work for IE & Opera
header("Content-type: image/jpeg"); // This should work for the rest
header('Content-Disposition: attachment; filename="photouser'.$id_utilisateur.'"');
echo $image;
La RFC concernant le header Content-Disposition précise qu'il s'agit d'une directive normalement destinées aux logiciels de mails. Toutefois, l'exemple de code de php.net précise que ça devrait forcer le browser à télécharger cette image comme fichier .JPG avec le nom indiqué (l'exemple est donné avec un .pdf, mais je pense que ça ne devrait rien changer).

Voilà, j'ai plus trop d'idée pour permettre aux utilisateurs de télécharger l'image, lorsque leur cache browser est désactivé, et en ayant bien un fichier .jpg.

Si vous arrivez à m'aider, je vous en remercie grandement

Sinon, je crois que je vais mettre tout sur le disque et oublier les 3 h de lecture de RFC que je viens de passer

Merci d'avance
Lordsephiroth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2007, 16h09   #2
Membre actif
 
Avatar de Lordsephiroth
 
Patrick Mingard
Inscription : mai 2006
Messages : 166
Détails du profil
Informations personnelles :
Nom : Patrick Mingard
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 166
Points : 185
Points : 185
Juste une petite précision, mon code HTML permettant l'affichage de l'image (correct dans le browser) ressemble à :

Code :
1
2
 
echo '<img src="monscript_image.php?id_utilisateur=202" alt="avatar de ..." />';
Lors du clic droit -> enregistrer sous..., c'est "monscript_image.php" qui est téléchargé mais avec le contenu de l'image réelle.
Lordsephiroth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2007, 16h31   #3
Membre chevronné
 
Avatar de djayp
 
Inscription : avril 2004
Messages : 290
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 290
Points : 617
Points : 617
Envoyer un message via ICQ à djayp
Salut !

Avec header(), il est effectivement possible de renommer le fichier, mais il ne faut pas oublier son extension :

Code :
header('Content-Disposition: attachment; filename="photouser'.$id_utilisateur.'.jpg"');
Si ca ne fonctionne pas, tu peux regarder du coté de l'URL rewriting qui te permet de renommer les URL en adresses web plus lisibles. Tu pourra par exemple tranformer le lien vers ton image

Code :
monscript_image.php?id_utilisateur=202
en

Tu trouveras plus d'infos ici

A++
__________________
Djay
http://j-place.developpez.com/
djayp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2007, 09h04   #4
Membre actif
 
Avatar de Lordsephiroth
 
Patrick Mingard
Inscription : mai 2006
Messages : 166
Détails du profil
Informations personnelles :
Nom : Patrick Mingard
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 166
Points : 185
Points : 185
L'ajout de l'extension au fichier ne change pas le problème, c'est toujours un .php qui est téléchargé.

Visiblement le serveur Apache est pas configuré pour accepter correctement l'URL rewriting. Le fichier httpd.conf contient :

Code :
1
2
3
 
AccessFileName .htaccess
LoadModule rewrite_module modules/mod_rewrite.so
Mais il ne contient pas :

Code :
1
2
 
AddModule mod_rewrite.c
Cette dernière ligne semble être indispensable pour le module d'URL rewriting. Il manque peut être aussi différentes autres lignes dont je n'ai l'information qu'elles soient indispensables.

Comme je n'ai pas vraiment possibilité de modifier ce fichier de config Apache, je pense que je vais me rabattre sur une autre solution : les images iront sur le disque sous forme de fichier...


(si vous avez d'autres suggestions, je suis toutefois preneur)
Lordsephiroth est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h41.


 
 
 
 
Partenaires

Hébergement Web