[Résolu] Images stockées dans Blob
-
- Messages : 32
- Inscription : 21 octobre 2012 à 18:54
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
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 :
J'écrirai à la place quelque chose de ce genre (à vérifier/corriger et à adapter car je n'ai pas testé mon 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);
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']);
-
- Messages : 32
- Inscription : 21 octobre 2012 à 18:54
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
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.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 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.
-
- Messages : 32
- Inscription : 21 octobre 2012 à 18:54
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