Publié le 28/04/2011
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
1 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.

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.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.
avatar mohamed

Publié par mohamed

le 14/04/2014 à 09:59:17

code comment publier tous les ficher en php5 et html5

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
php5 - db
Mise a jour
28/04/2011
Visualisation
vu 18838 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 267 articles
|BIO_PSEUDO|
Commentaires récents

Publié par Fobec dans tuto

Bonjour,

Sur Fobec.com, nous utilisons mod_expires.c pour envoyer automatiquement un code 304 au navigateur internet.
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType im...

Publié par PizzaToy dans php5

Salut,
super Class mais elle a fait son temps. Il faut maintenant passer la version 1.1 de l'API Twitter search et son authentification !

Publié par Pierrot dans CMS

Je présume que c'est plutot application.terminate;, le clavier à fourcher, ça m'arrive souvent.
@+

Publié par dinet dans CMS

merci, chokran, thank you

Publié par Fobec dans tuto

Je ne maitrise pas du tout WordPress ...
un plugin a l'air sympa http://wordpress.org/extend/plugins/scripts-gzip/, en parcourant le code source, j'ai vu des pistes pour integrer Gzip sous WordPre...