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 :

Affichage par PHP d'une image se trouvant dans la base de données


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

  2. #2
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    Juste une petite précision, mon code HTML permettant l'affichage de l'image (correct dans le browser) ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

  3. #3
    Membre éclairé
    Avatar de djayp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 295
    Points : 687
    Points
    687
    Par défaut
    Salut !

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    monscript_image.php?id_utilisateur=202
    en

    Tu trouveras plus d'infos ici

    A++

  4. #4
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AccessFileName .htaccess
    LoadModule rewrite_module modules/mod_rewrite.so
    Mais il ne contient pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/02/2013, 09h38
  2. Utiliser/appeler une image se trouvant dans le .jar (le classpath)
    Par Alba.1337 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 08/06/2012, 14h04
  3. [MySQL] enregistrer une chaine de caractére dans la base de donnée
    Par leaderchips dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/04/2010, 20h35
  4. Afficher image depuis texte dans la base de donnée
    Par bruce207 dans le forum Langage
    Réponses: 12
    Dernier message: 01/04/2010, 10h42
  5. [MySQL] Enregistrer les images et PDF dans la base de données
    Par ledisciple dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 06/10/2008, 13h18

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