Format BLOB : Comment stocker une image en base de données ?

Accueil PHP 8 Format BLOB : Comment stocker une image en base de données ?

Stocker une image dans une base de données (format BLOB) et l’afficher est une problématique courante en développement web, notamment lorsqu’il s’agit de gérer des fichiers utilisateur comme des avatars ou des documents numériques.

Ce guide vous explique les différentes étapes pour enregistrer une image en base de données, en détaillant les formats adaptés, la conversion en données binaires, ainsi que les bonnes pratiques à adopter pour optimiser les performances et la sécurité.

Enfin, nous abordons les différentes méthodes pour afficher ces images sur un site web, en tenant compte des contraintes liées aux requêtes et au chargement des fichiers.

Pourquoi stocker une image dans une base de données au format BLOB ?

Stocker des images directement dans une base de données présente certains avantages :

  • Centralisation des données : Toutes les informations sont stockées au même endroit, ce qui facilite la sauvegarde et la gestion des fichiers.
  • Sécurité accrue : Les fichiers étant stockés sous forme de données binaires, ils ne sont pas directement accessibles via l’URL, réduisant les risques d’accès non autorisé.
  • Intégrité des données : Une image est liée directement à l’enregistrement en base, ce qui évite les erreurs dues à la suppression accidentelle d’un fichier sur le serveur.

Cependant, cette méthode a aussi des inconvénients, notamment une augmentation de la taille de la base de données, ce qui peut ralentir les requêtes et compliquer la maintenance. Pour ces raisons, il est parfois préférable de stocker les images sur le serveur et d’enregistrer seulement leur chemin d’accès en base.

Stocker une image dans une base de données au format BLOB

Le format BLOB (Binary Large Object, ou « objet binaire de grande taille » en français) est un type de données utilisé dans les bases de données relationnelles pour stocker des fichiers binaires, comme des images, des vidéos, des documents PDF ou du son. Contrairement aux types de données textuels (VARCHAR, TEXT), un BLOB peut contenir des données brutes non interprétées par la base de données.

Caractéristiques du format BLOB

  • Stocke des fichiers binaires : Contrairement aux types de données textuelles, un BLOB peut contenir des informations non lisibles directement par un humain, comme des images, du son ou du code exécutable.
  • Taille variable : La capacité d’un BLOB dépend du type utilisé (voir section suivante).
  • Manipulation via des requêtes SQL : Les BLOBs peuvent être insérés, modifiés et récupérés à l’aide de requêtes SQL, mais nécessitent souvent des traitements spécifiques pour être affichés.
  • Utilisation intensive de la mémoire : Stocker de gros fichiers en base de données peut ralentir les performances du système, car les requêtes nécessitent le chargement de grandes quantités de données.

Les différents types de BLOB dans une base de données MySQL

MySQL propose plusieurs variantes du type BLOB, chacune ayant une capacité de stockage différente :

Type de BLOBTaille maximale
TINYBLOB255 octets
BLOB65 Ko
MEDIUMBLOB16 Mo
LONGBLOB4 Go
  • TINYBLOB est utile pour de très petits fichiers.
  • BLOB est suffisant pour de petites images ou fichiers de faible taille.
  • MEDIUMBLOB convient pour des fichiers audio ou des images de taille moyenne.
  • LONGBLOB permet de stocker de très grandes images, vidéos ou bases de données complètes.
format ou type BLOB

Avantages et inconvénients du stockage en BLOB

Avantages
Sécurité accrue ✔ (les fichiers ne sont pas accessibles via une URL directe).
Facilité de sauvegarde ✔ (tout est stocké dans la base de données).
Intégrité des données ✔ (pas de risque de fichiers manquants).

Inconvénients
Requêtes plus lourdes ❌ et impact sur les performances.
Nécessite plus d’espace ❌ en base de données.
Moins efficace qu’un stockage sur serveur ❌ pour les images volumineuses.

Le format BLOB est une solution puissante pour stocker des fichiers binaires directement en base de données, mais il doit être utilisé avec précaution pour éviter des ralentissements. Pour les images ou les fichiers volumineux, il est souvent préférable de stocker les fichiers sur le serveur et d’enregistrer uniquement leur chemin en base.

Stocker une image en base de données

La plupart des bases de données relationnelles, comme MySQL ou PostgreSQL, permettent de stocker des fichiers sous forme de données binaires grâce au type BLOB (Binary Large Object). Voici comment procéder en PHP avec MySQL.

Création de la table

Nous devons d’abord créer une table capable de stocker une image sous forme binaire :

CREATE TABLE images (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    image_data LONGBLOB NOT NULL
);

Le champ LONGBLOB permet de stocker des fichiers de grande taille. Si les images sont de taille réduite, BLOB ou MEDIUMBLOB peuvent suffire.

Formation web et informatique - Alban Guillier - Formateur

Des formations informatique pour tous !

Débutant ou curieux ? Apprenez le développement web, le référencement, le webmarketing, la bureautique, à maîtriser vos appareils Apple et bien plus encore…

Formateur indépendant, professionnel du web depuis 2006, je vous accompagne pas à pas et en cours particulier, que vous soyez débutant ou que vous souhaitiez progresser. En visio, à votre rythme, et toujours avec pédagogie.

Découvrez mes formations Qui suis-je ?

Téléchargement et insertion dans une base de données au format BLOB

Voici un script PHP permettant d’envoyer une image via un formulaire et de l’enregistrer en base de données :

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['image'])) {
    $conn = new mysqli("localhost", "root", "", "ma_base");

    if ($conn->connect_error) {
        die("Connexion échouée : " . $conn->connect_error);
    }

    $imageName = $_FILES['image']['name'];
    $imageData = file_get_contents($_FILES['image']['tmp_name']);

    $stmt = $conn->prepare("INSERT INTO images (name, image_data) VALUES (?, ?)");
    $stmt->bind_param("sb", $imageName, $imageData);
    $stmt->send_long_data(1, $imageData);

    if ($stmt->execute()) {
        echo "Image enregistrée avec succès.";
    } else {
        echo "Erreur : " . $stmt->error;
    }

    $stmt->close();
    $conn->close();
}
?>

<form method="POST" enctype="multipart/form-data">
    <input type="file" name="image" required>
    <button type="submit">Télécharger</button>
</form>

Ce script :

  • Connecte à la base de données.
  • Récupère le fichier soumis via le formulaire.
  • Convertit l’image en données binaires avec file_get_contents().
  • Enregistre dans la base via une requête préparée.

Afficher une image stockée en base de données

Une fois l’image stockée, nous devons la récupérer et l’afficher sur une page web.

<?php
$conn = new mysqli("localhost", "root", "", "ma_base");

if ($conn->connect_error) {
    die("Connexion échouée : " . $conn->connect_error);
}

$id = 1; // ID de l'image à afficher
$stmt = $conn->prepare("SELECT image_data FROM images WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$stmt->bind_result($imageData);
$stmt->fetch();
$stmt->close();
$conn->close();

header("Content-Type: image/jpeg");
echo $imageData;
?>

Ce script récupère les données binaires depuis la base et les affiche directement en définissant le bon type MIME.

Pour afficher l’image dans une page HTML, il suffit d’utiliser une balise <img> pointant vers ce script :

<img src="afficher_image.php?id=1" alt="Image">

Solution alternative : Stocker les images sur le serveur avec un chemin en base de données

Si vous gérez de nombreuses images, il est souvent plus efficace de les stocker sur le serveur et d’enregistrer seulement leur chemin en base de données.

CREATE TABLE images (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    path VARCHAR(255) NOT NULL
);

Enregistrement de l’image sur le serveur en l’upload dans un dossier :

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['image'])) {
    $uploadDir = "uploads/";
    $uploadFile = $uploadDir . basename($_FILES['image']['name']);

    if (move_uploaded_file($_FILES['image']['tmp_name'], $uploadFile)) {
        $conn = new mysqli("localhost", "root", "", "ma_base");
        $stmt = $conn->prepare("INSERT INTO images (name, path) VALUES (?, ?)");
        $stmt->bind_param("ss", $_FILES['image']['name'], $uploadFile);
        $stmt->execute();
        $stmt->close();
        $conn->close();
        echo "Image enregistrée.";
    } else {
        echo "Erreur lors de l'upload.";
    }
}
?>

Affichage de l’image stockée sur le serveur depuis le dossier d’upload :

<?php
$conn = new mysqli("localhost", "root", "", "ma_base");
$result = $conn->query("SELECT path FROM images WHERE id = 1");
$row = $result->fetch_assoc();
echo '<img src="' . $row['path'] . '" alt="Image">';
$conn->close();
?>

Stocker des images en base de données au format BLOB ou sur le serveur dépend des besoins et des contraintes de chaque projet. Si la sécurité et la centralisation sont des priorités, le stockage en base peut être une solution.

Cependant, pour de meilleures performances, il est souvent recommandé de stocker les images sur le serveur et de conserver uniquement leurs chemins en base. En suivant ces bonnes pratiques, vous pourrez gérer efficacement les fichiers multimédias de votre application tout en optimisant le temps de chargement et la gestion des ressources.

Pour améliorer votre SEO, pensez à :

Live on Twitch
  • 🔥 Vendredi 25 Avril 2025 >19h00

    HTML & SémantiqueStructure d'une page HTML