Afficher sur une page html une image stockée dans une bdd [Résolu/Fermé]

Signaler
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
-
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
-
Bonjour,

J'ai des images jpeg stockées dans une bdd (stockées vraiment, pas simplement l'url). Je ne souhaite pas revenir sur le débat de savoir si c'est une bonne idée ou non, j'ai bien pesé le pour et le contre et c'est cela qui me convient le mieux.

Mon problème c'est l'affichage de l'image. J'ai essayé avec deux techniques (echo, et imagejpeg - d'ailleurs je ne connais pas la différence, si quelqu'un peut m'éclairer), et chacune me renvoie "impossible d'afficher l'image car elle contient des erreurs", suivi d'une longue suite de caractères.

Mon but n'étant pas d'afficher l'image toute seule dans une page, mais au sein d'une page HTML, je passe par un fichier php intermédiaire qui affiche l'image, auquel renvoie le src de l'image dans mon code HTML.

Je n'ai pas uploadé l'image dans la bdd en passant par un script php, mais directement dans phpmyadmin. Lorsqu'on crée un champ BLOB une option s'affiche pour uploader directement le ficher.

Je ne sais pas si mon problème vient de l'upload (direct dans phpmyadmin) ou de mes scripts.

Voilà mon code:

$acte est la variable qui contient le "flux (?)" binaire du fichier que l'on récupère dans la bdd.

Fichier php qui contient la requête qui récupère, entre autres, l'image, suivi du code HTML pour l'affichage de la page HTML et de l'appel de l'image:

$id_n = $_GET['id_n'];

mysql_connect("localhost", "root", "");
mysql_select_db("ma_base");
$reponse = mysql_query("SELECT *, FROM table WHERE id='$id_n'");
$donnees = mysql_fetch_array($reponse);
	
$acte = $donnees['acte_n'];

(...)

// appelle l'image, et je fait passer la variable $acte dans l'url
<img src="image_bdd.php?acte=<?php echo $acte; ?>" alt="blabla" />



Fichier intermédiaire "image_bdd.php" qui affiche l'image:
<?php
$acte = $_GET['acte'];

header ("content-type: image/jpeg");
imagejpeg($acte);				

// j'ai également essayé avec la variante:
echo $acte;					
?>

Voilà si quelqu'un à un idée du problème ça m'aiderait bien!

Merci d'avance :)



12 réponses

Messages postés
5358
Date d'inscription
dimanche 3 février 2008
Statut
Membre
Dernière intervention
13 février 2017
880
passer toute l'image par GET ce n'est pas possible la limite autant que je me souvienne est de 255 caractères

Il y aurait aussi la solution de stocker l'image dans une variable de session
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Merci Alain! C'est ce que je me demandais (pour la limite de GET), et pour les variables de session je vais bucher ça, je n'ai pas encore appris le chapitre sur les sessions ;)

Merci encore de ton aide, si je trouve une solution je la posterai là :)
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Et voilà, les variables de session ont résolu le problème. Merci Alain!

Ca donne ça pour la requête et l'appel de l'image:

session_start();
$id_n = $_GET['id_n'];

mysql_connect("localhost", "root", "");
mysql_select_db("ma_base");
$reponse = mysql_query("SELECT *, FROM table WHERE id='$id_n'");
$donnees = mysql_fetch_array($reponse);

$_SESSION['acte'] = $donnees['acte_n'];

(...)

<img class="imgacte" src="editimage_bdd.php" alt="blabla" />


Et ça pour le script qui affiche l'image sur une page à part:

<?php
session_start();

header ("content-type: image/jpeg");
echo $_SESSION['acte'];	

?>



Voir également ici https://www.developpez.net/forums/d1226348/php/php-base-donnees/afficher-photo-d-bdd-mvc/ pour des explications très claires sur la différence en stocker l'image elle-même ou seulement l'url dans une BDD, et sur comment l'afficher.
Messages postés
3237
Date d'inscription
lundi 3 août 2009
Statut
Membre
Dernière intervention
22 septembre 2020
752
Pas besoin de te creuser longtemps la tête. Pour que tes images passent il faut qu'elle soit en format JPEG ou GIF voir en TIF
Apparemment les tiennes sont en JPEG, après il faut peut être revoir leur poids (leur taille), si par exemple se sont des photos numériques, elles risques d'être trop lourde.

Par bdd, tu veux dire banque de donnée, donc sur un site d'hébergement?
Ce serait probablement plus simple de faire rapatrié tes images sur ton disque dur et de les transférer sur ta page HTML directement
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Oui, ce sont bien des jpeg, et elles pèses entre 100 et 400 Ko. Et oui je sais ce serait plus simple autrement, mais comme je l'ai dit c'est dans ma base de données SQL que je souhaite les stocker.

Le poids ne devrait pas être le problème, ça devrait être long à la limite, mais pas me créer des erreurs dans l'image?
Messages postés
3237
Date d'inscription
lundi 3 août 2009
Statut
Membre
Dernière intervention
22 septembre 2020
752
As-tu essayé d'écrire toi même la page HTML?
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
J'ai tout écrit moi-même, la page est bien plus longue, je n'ai mis que ce qui est intéressant pour ce problème. C'est une page php qui commence avec une requête pour récupérer des infos, dont l'image. Puis il y a sur la même page le code html, ce qu'il y a de plus basique, sauf cette balise <img /> qui appelle l'image affichée ds le fichier php.
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Je me pose les questions suivantes:

1. Est-ce que mes images ont été mal uploadées (j'ai refait l'upload ds la bdd, et c'est pareil)

2. Est-ce que, comme je le fais, je peux faire la requête pour récupérer l'image sur une page, puis l'afficher sur une autre en faisant passer la variable dans l'url?
Messages postés
1270
Date d'inscription
dimanche 16 août 2009
Statut
Membre
Dernière intervention
30 décembre 2016
79
J'ai pas bien compris le problème ....

Soit c'est extrémement basique, càd tu cherche quelque chose de la forme suivante :

<?php

$res = mysql_query("SELECT img FROM table WHERE id=$id;")
$res_img = mysql_fetch_array($res);

print "<img src='/img/$res".$res_img[0]."'>";

?>

Soit j'ai pas compris ^^
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Je vois pas trop à quoi ressemble ton url de l'image. Mon image n'est pas dans un dossier "image", elle se trouve ds la bdd. Je n'ai pas stocké l'url de l'image ds la bdd, j'ai mis l'image elle-même, ds un champ blob. Pour la récupérer il faut un "header".
Messages postés
1270
Date d'inscription
dimanche 16 août 2009
Statut
Membre
Dernière intervention
30 décembre 2016
79
Je me disais aussi ^^ bah je savais même pas qu'on pouvais stocker des données de type jpg, png etc dans une BDD ^^'
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Alors, je crois que j'y suis presque ;) Le problème ne vient pas de l'upload, car j'ai réussi à afficher mon image. J'ai résolu deux problèmes sur trois, mais il y a encore quelque chose que je ne sais pas faire. Si yen a que ça intéresse je continue encore un peu!

1. J'avais une mauvaise concaténation : WHERE id='$id_n'"); ça ne marche pas du tout si id_n est un nombre.

2. Pour afficher l'image dans la page intermédiaire la fonction imagejpeg ne fonctionne pas, il faut mettre echo.

3. Et là je ne sais plus comment faire. Pour des raisons pratiques je voudrais faire la requête qui récupère l'image sur la 1ere page, celle qui contient la balise image, et "faire passer" le contenu binaire (je sais pas si c'est bien comme ça qu'on dit?) sur la page intermédiaire qui affiche l'image.
J'ai essayé avec une variable toute bête dans l'url, avec un $_GET pour la récupérer, mais ça ne marche pas.

Voilà donc ma question:
Si je fais la requête de l'image (qui est dans la bdd) sur la page intermédiaire ça fonctionne bien, mais si je la fais sur une autre page ça coince, je n'arrive pas à transférer le contenu de l'image (donc un "flux binaire"?) d'une page à l'autre. Ya t-il une variable spéciale pour faire cela? J'avais envie d'essayer avec $_FILE mais je crois que ça ne marche qu'avec les formulaires...

Merci d'avance!
Bonjour,
je vous cite:

_ je l'ai dit c'est dans ma base de données SQL que je souhaite les stocker.

SQL est le langage et non la base de données. Si vous utilisez une base mySQL le stockage d'image est impossible, il vous faut utiliser une solution plus costaude et payante comme Oracle.

_J'ai essayé avec une variable toute bête dans l'url, avec un $_GET pour la récupérer, mais ça ne marche pas.

En effet $_GET est une variable php donc du texte.

imajpeg et echo
Pour imajpeg voir manuel:
http://php.net/manual/fr/function.imagejpeg.php

echo permet d'écrire du texte, et traditionnellement on s'en sert pour écrire le html donc la balise image et l'url de celle ci.

Vous ne voulez pas relancer le débat entre stockage base de données et stockage hébergeur mais votre solution ne convient pas.
La solution employée est d'uploader l'image dans un dossier de votre hébergeur(move_uploaded_file en php) et d'enregistrer son adresse dans la base ainsi quand vous voulez l'afficher cela marchera comme pour un site statique mais en dynamique(l'url étant une variable que vous récupérez sur la base).

ps:il existe le format blob qui permet de stocker des données binaires sur la base mais les images jpeg(ou jpg) sont d'un autre format et vous ne pourrait utiliser que des formats d'image non compressés comme le bmp qui convient très peu à l'affichage sur internet.

Le mieux serait de suivre un tutoriel comme celui du site du zéro et d'adapter votre façon de faire à celles existantes plutôt que l'inverse.

edit: il s'agit bien d'un champ blob mais comme dit précédezment il ne correspond pas
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Stocker des images dans une bdd ça se fait, ya des avantages et des inconvénients, mais ça se fait (et ça s'affiche aussi très bien dans une page php). Pour plus d'info voir ici ftp://ftp-developpez.com/beaussier/phpblobmysql.zip

J'ai d'ailleurs bien réussi à afficher les miennes en faisant la requête et l'affichage (avec header, et echo) sur la même page.

Mon problème et de trouver un moyen (si cela existe) de faire la requête sur une autre page et de faire passer le contenu de la variable contenant les données binaires (c'est à dire l'image) sur une autre page.

Merci ;)
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Et dernière chose, une variable en php ça ne stocke pas que du texte, on peut y mettre des nombres, des booléens, et même des fichiers ($_FILES). Et dans mon code, $acte stocke bien les données binaires récupérées de la bdd avant de les afficher comme une image si on pense bien à changer le "content-type".
Messages postés
509
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
17 avril 2013
90
Y'a bien une petite astuce un peu utilisé à ce niveau, ça consisterai à stocker l'image dans la base de données en base64

pour l'afficher :
<img src="data:image/jpeg;base64, lesdonnesrecupérerdelabdd"/>


sachant que l'encodage de donnée en base64 donne une chaine, plus de probleme de caractère :)
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Oui merci, mais ce n'est plus l'affichage lui même qui me pose problème, (en stockant des jpeg dans la bdd dans un blob, on peut les afficher très facilement avec un header et un echo) c'est le passage des données d'une page à l'autre.
Messages postés
5358
Date d'inscription
dimanche 3 février 2008
Statut
Membre
Dernière intervention
13 février 2017
880
Salut,
passes seulement $id_n par GET de la page une à la page 2 et refait une requette dans la deuxième page pour affichage
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Oui, merci, ça marche effectivement très bien en refaisant la requête, mais juste par curiosité j'aurais bien aimé passer toute la variable de l'image dans la 2ème page. Je vais creuser encore un peu, avec une variable globale peut-être... Sinon je vais retourner à la simplicité :)

Merci!
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
31
Dernière précision, sur la limite du nombre de caractères dans la variable $_GET, je viens de tomber là-dessus, sur le site https://apprendre-php.com/tutoriels/tutoriel-12-traitement-des-formulaires-avec-get-et-post.html

Note : contrairement à ce que l'on peut lire fréquemment sur la toile, la limite maximale d'une URL n'est pas de 255 caractères. Il n'existe en réalité aucune limite standard. En effet, la taille maximale d'une URL peut-être configurée à la fois côté serveur ou côté client. Un administrateur de serveur web peut à sa guise augmenter ou diminuer la longueur maximale des URLs. Quant aux navigateurs, eux aussi fixent par défaut une taille maximale. Il est donc recommandé de ne pas abuser de la longueur d'une URL lorsque l'on ne maîtrise pas l'intégralité de son environnement de production (serveur Web et clients).