[Résolu] Images stockées dans Blob

Vous avez un soucis de développement et ce n'est pas du ressort de notre support ? N'hésitez pas à soumettre vos petits soucis de développement et à vous entre aider par la même occasion.
Répondre
Philippe40
Messages : 32
Enregistré le : 21 octobre 2012 à 18:54

Bonjour à tous.

Voici mon problème :

Je stocke une image dans un champ blob de ma base Mysql à l'aide de la requête sql ci-dessous
dans le champ nommé image_small
\t
$sql = "INSERT INTO wp3_articles (code_article, image_small)
VALUES ('$_POST[codearticle]',decode('$_POST[imagesmall]', 'base64'))";

Pour afficher mon image sur une page web j'exécute le php suivant :

<?php
$host='localhost';
$user='xxxx';
$pass='';
$base='basededonnee';


$idPhoto0 = $_GET['idPhoto'];
$link = $dbh = new PDO('mysql:host='.$host.';dbname='.$base, $user, $pass)
$sql = "select image_small from wp3_articles where code_article='{$idPhoto0}' " ;
$res = $link->query($sql);\t
$raw = mysql_fetch_row($res, 'image_small');
header('Content-Type: image/jpeg');

echo mysql_real_escape_string($raw);

pg_close($link);
?>
Je n'ai pas de restitution de mon image

J'ai testé équivalent sur une base Postgresql dans un champ bytea avec le php équivallent :

<?php
$idPhoto0 = $_GET['idPhoto'];
$link = pg_connect("xxxxxxxxxxxxxxxx");
$sql = "select image_small from wp3_articles where code_article='{$idPhoto0}' " ;
$res = pg_query($link, $sql);
$raw = pg_fetch_result($res, 'image_small');
header('Content-Type: image/jpeg');
echo pg_unescape_bytea($raw);
pg_close($link);
?>

ça marche sans problème.

La différence de stockage est tous 2 binaires
Postgresql : byte[] Mysql : Blob

La lecture des données hex dans les champs postgresql et mysql sont différents

Avez vous une explication de cette différence ?
Avez-vous une suggestion à me faire pour m'aider à résoudre ce problème ?

Merci d'avance

Cordialement
Philippe
Avatar du membre
Elodie
Messages : 7734
Enregistré le : 2 avril 2010 à 20:14

Bonjour Philippe,

Bien que vous ayez dans votre code des fonctions PDO (et un reliqua de pg_close de Postgrès à la fin de votre code SQL), vous mélanger du PDO avec des fonctions MySQL (mysql_fetch_row() et mysql_real_escape_string()) qui sont supprimées depuis PHP 7.

Aussi, vous n'utilisez pas réellement les avantages de PDO pour éviter par exemple l'injection SQL, vous tentez de le faire à l'aide de mysql_real_escape_string (fonction qui n'existe plus) après la requête où ce n'est plus nécessaire car l'attaque par injection aurai déjà pu avoir lieu.

À la place de votre code :
philippe40 a écrit : $sql = "select image_small from wp3_articles where code_article='{$idPhoto0}' " ;
$res = $link->query($sql);
$raw = mysql_fetch_row($res, 'image_small');
header('Content-Type: image/jpeg');
echo mysql_real_escape_string($raw);
J'écrirai à la place quelque chose de ce genre (à vérifier/corriger et à adapter car je n'ai pas testé mon code) :

Code : Tout sélectionner

$sql = "select image_small from wp3_articles where code_article = :idPhoto;";
$sth = $link->prepare($sql);
$res = $sth->execute(':idPhoto' => $_GET['idPhoto']); 
$raw = $res->fetch();
header('Content-Type: image/jpeg');
echo($raw['image_small']);
Petit conseil, activez l'affichage des messages d'erreurs et d'alertes PHP et commentez la fonction header() pour vérifier le résultat avant d'essayer d'avoir une image finale.
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Philippe40
Messages : 32
Enregistré le : 21 octobre 2012 à 18:54

Un grand merci pour toutes vos explications bien utiles.
Je ne suis pas un grand spécialiste PHP (plutôt un grand débutant) mais cette partie n'est pas le cœur de mon métier. Cependant vos explications dans mon mélange de PDO
et les fonctions Mysql me montre un chemin d'apprentissage.

J'ai réussi à afficher des images stockées dans un blob dans mes pages web.
(première étape à la résolution de mon problème)
Pour enregistrer mes image j'utilise un upload dans une page index.php
<body>
<form enctype="multipart/form-data" action="upload.php" method="post">
<label>Uploader le fichier image:</label><br />
<input name="userImage" type="file" />
<input type="submit" value="Uploader" />
</form>
</div>
</body>

et j'enregistre ainsi mes images dans upload.php avec les commandes suivantes ;
//Récupérer le contenu de l'image
$file = $_FILES['userImage']['tmp_name'];
$image = addslashes(file_get_contents($file));

Cela se fait manuellement.


Mon problème est le suivant :
Les images sont contenues dans une base de données SQLITE dans un champ blob
j'utilise un programme c# pour lire les données de ma base et les transférer dans la base de données Mysql du serveur francesrv. à l'adresse http://pensebete.franceserv.fr/insert.php"

le programme c#
Les données blob sont transformées en text avec un codage 64bits
data.Add("imagesmall", Convert.ToBase64String(vh.ImageSmall)
La commande qui envoie les données au serveur
var response = client.PostAsync("http://pensebete.franceserv.fr/insert.php", encodedContent);
l
Coté serveur j'ai le script insert.php
ma requête d'insertion est
$sql = "INSERT INTO wp3_articles (code_article, generic_name,product_name,image_small)
\tVALUES
('$_POST[codearticle]',
'$_POST[genericname]',
'$_POST[productname]',
decode('$_POST[imagesmall]', 'base64'))";

Les données s'nregistrent dans la base de données Mysql sans problème mais la conversion des données blob ne correspond pas à des images. => lecture des images impossible

Si j'utilise avec la même requête dans une base postgresql, je n'ai pas de problème
La différence entre postgresql et Mysql est le type de champ utlisé : Bytea pour porgresql et blob pour Mysql.

Avez-vous une idées pour résoudre mon problème ?

Cordialement
Philippe
Avatar du membre
Elodie
Messages : 7734
Enregistré le : 2 avril 2010 à 20:14

Bonjour,
philippe40 a écrit :Les données s'nregistrent dans la base de données Mysql sans problème mais la conversion des données blob ne correspond pas à des images. => lecture des images impossible
Il vous faudrait afficher en texte brute le contenu de l'image (sans l'header de type image) afin de vérifier si vous trouvez à l'intérieur du code source des éléments indiquant que c'est bien une image.

Il m'est déjà arrivé avoir une image générée dynamiquement par PHP impossible à afficher et en vérifiant le code brute, m'apercevoir que c'était simplement un message d'erreur et non pas une image. Ou encore plus sournois, j'ai déjà eu un Warning dans le résultat de l'image qui elle était bien codée, sauf qu'avec le texte Warning l'image ne pouvait pas s'afficher.
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Philippe40
Messages : 32
Enregistré le : 21 octobre 2012 à 18:54

J'ai enfin trouvé la solution à mon problème :

1) Contrairement à ma requête sur la base de données postgresql, il ne faut pas utiliser decode
decode('$_POST[imagesmall]', 'base64'))";
mais seulement mettre le champ comme tous les autres c'est à dire pour ce cas seulement
'$_POST[imagesmall]'

Dans le champ blob, les données de la base Mysql ne sont pas enregistrées au format 64

2) Dans la requête de lecture des données il faut transformer le champ blob
FROM_BASE64(image_small) as image_small pour que la restitution de l'image se fasse correctement

echo '<td>' .
'<img src = "data:image/png;base64,' . base64_encode($data['image_small']) . '" width = "50px" height = "50px"/>'
. '</td>';
echo '</tr>';

Je partage avec vous la solution de ce problème qui m'a demandé beaucoup de temps de réflexion pour ceux qui serait intéressés

Cordialement
Philippe
Répondre