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 18811 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 267 articles
|BIO_PSEUDO|
Commentaires récents

Publié par FOBEC dans CMS

test
commentaire

Publié par Roy2014 dans tuto

Bonjour et merci pour ce tuto interessant. Je pense que tout le monde souffre avec 1and1 du fait que l'on puisse pas gziper directement via le htaccess!!
j'aurais une petite question:
tu dis a p...

Publié par luckyboy dans CMS

ont voir rien pas de code!!!!

Publié par skud dans java

La methode getTextFile() etant statique, il faut donc l'appeler de maniere statique. Modifier l'exemple de la maniere suivante

System.out.print(HTTPLoader.getTextFile('http://fobec.com/CMS/ind...

Publié par deefaze dans CMS

R := Byte(Color);
G := Byte(Color shr 8);
B := Byte(Color shr 16);