Bonsoir,
j'ai programmé une interface pour un catalogue d'objets.
Un objet est définit par des propriétés et une image.
Les objets sont stockées dans une base de données relationnelle PostgreSQL
Il est possible d'ajouter un objet depuis l'interface Web.
Voici le code simplifié qui permet de récupérer l'image après l'avoir posté dans un formulaire à l'aide de l'élément "input" de type "file":
// récupération du chemin de l'image sur le serveur
$photo_tmpName = $_FILES['photo']['tmp_name'];
$photo_size = $_FILES['photo']['size'];
// serialisation de l'image dans une string
$fp = fopen($photo_tmpName, "r");
$buffer = fread($fp, $photo_size);
fclose($fp);
// creation d'un objet de grande taille et récupération de son oid
pg_query($conn, "begin");
$oid = pg_lo_create($conn);
$handle = pg_lo_open($conn, $oid, "w");
pg_lo_write($handle, $buffer);
pg_lo_close($handle);
pg_query($conn, "commit");
// insert dans la base
$query = "INSERT INTO img (data) VALUES ('$oid')";
pg_query($query) or die("Cannot insert data. ".pg_last_error());
Pour afficher une image, il suffit d'avoir l'OID de celle-ci et de le transmettre à la page image.php telle que :
header("Content-type: image/jpeg");
include ('connectdb.php'); // don't forget to close connection : pg_close($conn);
pg_query($conn, "begin");
$handle = pg_lo_open($conn, $_GET["oid"], "r");
pg_lo_read_all($handle);
pg_query($conn, "commit");
pg_close($conn);
Il est possible d'afficher une liste d'objets résultant d'une une requête sur la base de données.
Je récupère donc un tableau de résultats que je parcours à l'aide d'une boucle dont voici le code :
include ('connectdb.php'); // don't forget to close connection : pg_close($conn);
$query = ("SELECT data FROM img");
$result = pg_query($query) or die(pg_last_error());
pg_close($conn);
while ( $row = pg_fetch_array($result) ) {
$oid = $row["data"];
echo "<img src=\"image.php?oid=".$oid."\" alt=\"\" />\n";
}
Mon problème :
- Lorsque j'accède directement à la page image.php avec l'oid de l'image que je veux voir, celà fonctionne.
Lorsque j'affiche la page qui contient la boucle, les images ne s'affichent pas toutes.
Les pages sont hébergées chez Free, j'ai essayé de rajouter un sleep(1) dans la boucle histoire de voir s'il s'agissait d'un problème de surcharge du serveur SQL ou Web mais cela donne le même résultat.
Curiosité :
Si j'affiche la page qui ne charge pas toutes les images et que dans une autre fenêtre j'accède directement à une image (qui ne s'affiche pas) via image.php, elle apparait. Puis lorsque j'actualise la fenêtre ou elle n'est pas apparue, elle s'affiche et disparait immédiatement.
J'ai cherché sur Internet et sur ce forum sans succès, donc je m'en remet à vos avis, connaissances et expériences en la matière en vous remerciant d'avance du temps passé à la résolution de mon problème
Cordialement