Quelle méthode choisir?
Il est possible d'insérer directement des images (et
même du code HTML) sous forme binaire dans une base
de données relationnelle MySQL, plutôt que d'y faire
figurer le lien vers l'image (elle-même stockée
quelque part dans le système de fichiers). Est-ce pour autant
une bonne solution? Des images directement stockées dans
la base de données ne vont pas manquer d'alourdir considérablement
cette dernière, ralentissant les accès. On pourrait
avancer néanmoins que cela permettrait de sécuriser
les images (en empêcher le piratage) si celles-ci doivent
l'être. Mais il est aussi possible de stocker les images
en dehors de l'arborescence web, et de garder des liens dans
la base de données.
Malgré ces réserves, stocker les images sous forme
binaire dans un champ de la base de données peut avoir son
intérêt. Si par exemple on désire effectuer
des recherches sur des formes au sein des images. Cet article a
donc deux objectifs: 1) présenter une méthode
pour stocker des images via des liens dans la base, et en
dehors de l'arborescence web; 2) présenter une méthode
pour stocker des images, si besoin est, directement dans la base
de données.
Accéder à des images situées
en dehors de l'arborescence web
La méthode est très simple: l'appel à
une image se fera grâce à un script PHP (appelons-le
"afficher_image") de la forme:
<?php
header('content-type:
image/gif');
readfile('/chemin/vers/les/images/image.gif');
?>
que l'on appelle au moyen de l'instruction HTML:
<img src="afficher_image.php">
Il sera bien sûr plus commode de passer en paramètre
le type de l'image et le nom du fichier correspondant afin d'automatiser
la procédure.
Stocker directement des images avec MySQL
Il nous faut créer une base (nous l'appellerons "essai")
et une table (nous l'appellerons "images_binaires") qui
comprendra les champs suivants: id (un entier), donnees_binaires
(type MySQL LONGBLOB), nom_fichier (une chaîne), taille_fichier
(une chaîne), type_fichier (une chaîne), et,
éventuellement, un champ description (une chaîne).
On n'oubliera pas de préciser "auto_increment"
pour l'identifiant. Nous allons insérer les images dans la
base à l'aide, par exemple, d'un formulaire HTML. Il ressemblera
à:
<form method="post" action="inserer_image.php"
enctype="multipart/form-data">
Nom du fichier: <input type="file" name="image"
size="40">
<br><input type="submit" name="ok">
</form>
Notre programme inserer_image.php sera alors le suivant:
<?php
mysql_connect("","root","");
mysql_select_db("essai");
$donnees = addslashes(fread(fopen($image,
"r"), filesize($image)));
$result=mysql_query("INSERT INTO images_binaires
(donnees_binaires,nom_fichier,taille_fichier,type_fichier) VALUES
('$donnees','$image_name','$image_size','$image_type')");
$id= mysql_insert_id();
print "<br>Indentifiant du fichier
dans la base: $id<br>";
mysql_close();
?>
Un petit programme php, afficher_image.php, va permettre de récupérer
l'image dans la base:
<?php
@mysql_connect("","root","");
@mysql_select_db("essai");
$requete
= "SELECT donnees_binaires,type_fichier FROM images_binaires
WHERE id=$id";
$resultat
= @mysql_query($requete);
$donnees
= @mysql_result($resultat,images_binaires.donnees_binaires);
$type
= @mysql_result($resultat,0,images_binaires.type_fichier);
header(
"content-type: $type");
echo
$donnees;
?>
On appellera ce programme avec une instruction HTML du type:
<img src="afficher_image.php"?id=identifiant>
où l'on précisera l'identifiant correspondant.
|