Une image ou tout autre donnée binaire peut être stockée dans une table MySQL. Utiliser une base de donnée à la place d'un système de fichier présente certains avantages:
- pas d'arborescence de fichiers à mettre en place, tout est regroupé dans la base de donnée,
- le détail d'une image (nom, taille, description) peut directement être ajouté au flux,
- le 'tout-en-un' améliore la sécurité et la maintenance des données.
Créer la table dans la base MySQL
Pour l'exemple, la table est réduite à son minimum, c'est à dire un champs unique pour le nom de l'image et un champ blob pour le stockage des données. A l'aide de l'éditeur SQL ou de la console, copier/coller les instructions ci-dessous.-- Structure de la table `tbl_image`
--
CREATE TABLE IF NOT EXISTS `tbl_image` (
`IMG_NAME` varchar(32) character set utf8 NOT NULL,
`IMG_STREAM` blob NOT NULL,
UNIQUE KEY `IMG_NAME` (`IMG_NAME`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
Enregistrer et lire une image à partir de MySql
Afin de rendre le code réutilisable, regroupons les fonctions suivantes dans une class:- setLogin(): fixer les identifiants de connexion à la base de donnée,
- write(): ajouter une image à la table. Une exception est générée lorsque le nom de l'image existe déjà,
- read(): retourne le contenu d'une image.
<?php
/**
* Charger/enregistrer une image dans une BD MySQL
* @author Fobec 2011
*/
class DBImage {
//identifiant de connection
private $DB=array('server'=>'','user'=>'', 'password'=>'', 'db'=>'');
/**
* Fixer les identifiants de connection
* @param $server
* @param $user
* @param $password
* @param $db
*/
public function setLogin($server, $user, $password, $db) {
$this->DB['server']=$server;
$this->DB['user']=$user;
$this->DB['password']=$password;
$this->DB['db']=$db;
}
/**
* Sauver une image
* @param string $filename nom du fichier image
* @param string $name nom de l'image dans la table
*/
public function write($filename, $name) {
/**
* Charger le fichier
*/
if (!file_exists($filename)) {
throw new Exception("File $filename not found !!!");
}
$fp = fopen($filename, 'r');
$data = fread($fp, filesize($filename));
$buf = addslashes($data);
fclose($fp);
/**
* Enregistrer dans la table
*/
mysql_connect($this->DB['server'], $this->DB['user'], $this->DB['password']);
mysql_select_db($this->DB['db']);
mysql_query("INSERT INTO tbl_image (IMG_NAME, IMG_STREAM) VALUES ('".$name."','".$buf."')");
$error=mysql_error();
if (!empty($error)) {
throw new Exception($error);
}
}
/**
* Charger une image
* @param string $name nom de l'image dans la table
* @return
*/
public function read($name) {
mysql_connect($this->DB['server'], $this->DB['user'], $this->DB['password']);
mysql_select_db($this->DB['db']);
$q=mysql_query("SELECT IMG_STREAM from tbl_image WHERE IMG_NAME='".$name."'");
if (mysql_num_rows($q)==0) {
throw new Exception($name.' not found');
}
$rows=mysql_fetch_array($q);
return $rows['IMG_STREAM'];
}
}
?>
Ajouter une image à la base de donnée
L'enregistrement d'une image dans la table regroupe les opérations de :- lecture du fichier contenant l'image vers un tampon,
- ouverture d'une connexion à la base,
- requête SQL d'insertion de la nouvelle image.
<?php
$DBImage=new DBImage();
//fixer les identifiants
$DBImage->setLogin('nom_serveur', 'utilisateur', 'mot_de_passe','db3');
//sauver une image
$DBImage->write('logo.gif', 'mypict');
?>
Charger l'image à partir de la base de donnée
Dans l'exemple, chargeons le flux de données de 'mypict' enregistrée précédemment. Le flux retourné pourra être enregistré dans un fichier ou comme ci-dessous affiché dans le navigateur internet.<?php
$DBImage=new DBImage();
//charger afficher l'image
$stream=$DBImage->read('mypict');
header('Content-type: image/gif');
echo $stream;
?>
Mise en garde
Avant de mettre en place le stockage d'image dans une base, il est bon de prendre en considération les faiblesses du système:- l'utilisation d'un langage de programmation est obligatoire pour accéder aux images. On ne peut plus accéder aux données avec FTP par exemple,
- une erreur sur la table provoque la perte de toutes les images,
- l'accès aux données à partir d'un fichier est plus rapide qu'au travers d'une base de donnée.