Publié le 28/04/2011
Réseaux sociaux
2 partages
0 tweets
0 plus
0 commentaires
Stocker une image dans une BD MySQL
Comment enregistrer une image dans une base de donnée ?
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.
- 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.
- lecture du fichier contenant l'image vers un tampon,
- ouverture d'une connexion à la base,
- requête SQL d'insertion de la nouvelle image.
- 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.
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;
-- 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;
Class PHP DBImage
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.