S***@gmail.com
2007-02-12 11:25:01 UTC
Bonjour,
Je cherche à stocker une image dans un champ de type BLOB d'une base
de données sous MySQL. Jusque là, rien de bien compliqué :
$fichier=file_get_contents("/images/image.jpg"); // On transforme le
fichier en une chaîne compatible avec BLOB.
$fichier = addslashes ($fichier); // (Pour éviter de déclencher un bug
MySQL)
mysql_query ("INSERT INTO table(id,img) VALUES ('',' ".$fichier."
')");
Maintenant si je veux afficher, je suis obligé de faire tout ça:
header("Content-type: image/jpg"); // Mise en place d'un en-tête MIME
de type jpeg.
$reponse = mysql_query ("SELECT img FROM table WHERE id='1' ");
$donnees = mysql_fetch_array($reponse);
$image = stripslashes($donnees['img']); // On récupère la chaine de
départ dans une variable.
$image = imagecreatefromstring($image); // On convertit la chaine en
une ressource image GD
imagejpeg($image); // On affiche l'image encodée en JPEG.
Sauf que ça marche pas !!!
La fonction "imagecreatefromstring" renvoie l'erreur suivante :
"Warning: imagecreatefromstring() [function.imagecreatefromstring]:
Data is not in a recognized format [...]"
Je me suis donc interrogé sur l'origine du problème, et j'ai testé le
code suivant :
$fichier=file_get_contents("/images/image.jpg"); // Conversion du
fichier en chaine binaire.
$fichier = addslashes ($fichier); // Ajout de slashes devant les
caractères spéciaux.
header("Content-type: image/jpg"); // Mise en place d'un en-tête MIME
de type jpeg.
$image = stripslashes($fichier); // "Nettoyage" des slashes
précédemment ajoutés.
$image = imagecreatefromstring($image); // Conversion de la chaîne
binaire en ressource image GD.
imagejpeg($image); // Affichage de l'image encodée en JPEG.
Or ce code fonctionne parfaitement.
J'en ai donc déduit que la chaîne était modifiée soit lors de son
chargement dans la table, soit lors de la conversion de la ressource
résultat en tableau. Un autre possibilité serait que MySQL renvoie un
résultat différent de ce qui est réellement stocké dans la base.
J'ai vérifié que la chaîne était effectivement différente entre
l'entrée et la sortie en comparant les md5, mais je ne sais pas
comment tester sélectivement les différentes hypothèses proposées ci-
dessus
Je me suis également assuré que la taille des fichiers n'était pas en
cause, mais mes champs sont de type "LONGBLOB", qui limite la taille à
2^32 octets, soit 4 Mio, et j'ai effectué mes tests avec une image de
35,8 Kio.
Je ne comprend donc pas l'origine du problème. Quelqu'un aurait-il une
idée ?
Merci beaucoup !
Je cherche à stocker une image dans un champ de type BLOB d'une base
de données sous MySQL. Jusque là, rien de bien compliqué :
$fichier=file_get_contents("/images/image.jpg"); // On transforme le
fichier en une chaîne compatible avec BLOB.
$fichier = addslashes ($fichier); // (Pour éviter de déclencher un bug
MySQL)
mysql_query ("INSERT INTO table(id,img) VALUES ('',' ".$fichier."
')");
Maintenant si je veux afficher, je suis obligé de faire tout ça:
header("Content-type: image/jpg"); // Mise en place d'un en-tête MIME
de type jpeg.
$reponse = mysql_query ("SELECT img FROM table WHERE id='1' ");
$donnees = mysql_fetch_array($reponse);
$image = stripslashes($donnees['img']); // On récupère la chaine de
départ dans une variable.
$image = imagecreatefromstring($image); // On convertit la chaine en
une ressource image GD
imagejpeg($image); // On affiche l'image encodée en JPEG.
Sauf que ça marche pas !!!
La fonction "imagecreatefromstring" renvoie l'erreur suivante :
"Warning: imagecreatefromstring() [function.imagecreatefromstring]:
Data is not in a recognized format [...]"
Je me suis donc interrogé sur l'origine du problème, et j'ai testé le
code suivant :
$fichier=file_get_contents("/images/image.jpg"); // Conversion du
fichier en chaine binaire.
$fichier = addslashes ($fichier); // Ajout de slashes devant les
caractères spéciaux.
header("Content-type: image/jpg"); // Mise en place d'un en-tête MIME
de type jpeg.
$image = stripslashes($fichier); // "Nettoyage" des slashes
précédemment ajoutés.
$image = imagecreatefromstring($image); // Conversion de la chaîne
binaire en ressource image GD.
imagejpeg($image); // Affichage de l'image encodée en JPEG.
Or ce code fonctionne parfaitement.
J'en ai donc déduit que la chaîne était modifiée soit lors de son
chargement dans la table, soit lors de la conversion de la ressource
résultat en tableau. Un autre possibilité serait que MySQL renvoie un
résultat différent de ce qui est réellement stocké dans la base.
J'ai vérifié que la chaîne était effectivement différente entre
l'entrée et la sortie en comparant les md5, mais je ne sais pas
comment tester sélectivement les différentes hypothèses proposées ci-
dessus
Je me suis également assuré que la taille des fichiers n'était pas en
cause, mais mes champs sont de type "LONGBLOB", qui limite la taille à
2^32 octets, soit 4 Mio, et j'ai effectué mes tests avec une image de
35,8 Kio.
Je ne comprend donc pas l'origine du problème. Quelqu'un aurait-il une
idée ?
Merci beaucoup !