Firebase Storage est un service de stockage de fichiers dans le cloud qui fait partie de l'écosystème Firebase de Google, conçu pour téléverser et télécharger des images, des vidéos, de l'audio et d'autres données binaires à partir d'applications mobiles et web. Contrairement à un disque cloud classique, Storage s'intègre avec Firebase Authentication et Security Rules, permettant un contrôle d'accès flexible à chaque fichier au niveau de la requête. Selon Google Firebase (2026), le service traite plus de 500 millions d'opérations de fichiers par jour, offrant un stockage évolutif sans avoir à gérer d'infrastructure serveur.
Points clés
Firebase Storage est un stockage d'objets dans le cloud construit sur Google Cloud Storage qui fournit des SDK pour Android, iOS et les plateformes web. Chaque fichier est stocké comme un objet dans un bucket Google Cloud et est adressé par un chemin semblable à un système de fichiers : gs://bucket-name/path/to/file.jpg. Un seul fichier peut atteindre 5 To, permettant de stocker toutes données multimédia sans compression préalable.
L'architecture de Firebase Storage utilise un modèle de référence de liens (gsutil references) plutôt qu'une hiérarchie de dossiers classique, bien que le SDK fournisse une interface avec répertoires pour la commodité du développeur. Physiquement, tous les objets sont stockés dans l'espace de noms plat du bucket, et les dossiers virtuels sont créés à l'aide de préfixes de chemin. Cela garantit des performances de recherche linéaires quel que soit le nombre de fichiers.
L'avantage clé de Firebase Storage par rapport à l'utilisation directe de Google Cloud Storage est l'intégration intégrée avec Firebase Authentication et Security Rules. Le développeur n'a pas besoin de configurer des rôles IAM et des comptes de service séparés : les règles d'accès sont écrites dans un langage déclaratif similaire à Firebase Realtime Database Rules et sont appliquées automatiquement à chaque requête.
Un bucket Firebase Storage est créé automatiquement lors de l'activation du service dans la console Firebase. Le chemin du fichier suit le modèle /nom_dossier/nom_fichier et peut contenir des niveaux imbriqués. Il est recommandé d'organiser les chemins selon le schéma /users/{userId}/images/{imageId}.jpg pour isoler les données entre utilisateurs. Cette structure simplifie l'écriture des règles de sécurité car le chemin contient l'identifiant du propriétaire.
Il est important de comprendre que Firebase Storage n'est pas une base de données relationnelle ou un serveur de fichiers au sens classique. C'est un stockage d'objets optimisé pour les opérations de lecture et d'écriture de fichiers entiers. La mise à jour partielle d'un fichier n'est pas possible : si vous retéléversez au même chemin, l'ancien objet est remplacé par le nouveau. Pour stocker de petites données structurées, utilisez Firebase Realtime Database ou Cloud Firestore.
Les tarifs de Firebase Storage dépendent de la quantité de données stockées et du nombre d'opérations. Le forfait gratuit (Spark) comprend 5 Go de stockage, 20 000 opérations d'écriture et 50 000 opérations de lecture par jour. Le forfait payant (Blaze) facture selon l'utilisation réelle : 0,026 $ par Go de données stockées, 0,05 $ pour 10 000 opérations d'écriture et 0,004 $ pour 10 000 opérations de lecture. Des frais supplémentaires s'appliquent pour le trafic sortant.
Pour la plupart des applications mobiles avec quelques milliers d'utilisateurs, la limite gratuite est suffisante pendant la phase de prototypage et de test. Lors du passage à des centaines de milliers d'utilisateurs, les coûts de Storage dépassent rarement 50 à 100 $ par mois avec une approche de téléversement optimisée et une mise en cache côté client.
Le téléversement d'un fichier dans Firebase Storage s'effectue via la méthode SDK appropriée, qui accepte un chemin de stockage et les données du fichier (tableau d'octets, URI, flux ou Bitmap). Le SDK gère automatiquement la connexion, segmente le fichier en parties pour les grandes tailles et fournit des callbacks pour le suivi de la progression. Le téléversement s'effectue directement depuis le périphérique client vers Google Cloud, sans passer par votre serveur, ce qui réduit la charge sur votre propre infrastructure.
Pour Android, le SDK Firebase Storage utilise les classes StorageReference et UploadTask. Une StorageReference est créée à partir du chemin racine via Firebase.storage.reference et pointe vers un fichier spécifique dans le bucket. UploadTask renvoie des écouteurs pour la progression, la pause et l'achèvement. Lorsqu'une connexion est interrompue, UploadTask reprend automatiquement le téléversement à partir du dernier octet transmis avec succès — ce comportement est appelé téléversement reprenable.
Les métadonnées du fichier (Content-Type, champs personnalisés) sont transmises comme un objet SettableMetadata séparé au début du téléversement. Définir correctement le Content-Type est essentiel pour l'affichage correct des fichiers dans le navigateur et la mise en cache CDN. Firebase Storage prend en charge tous les types MIME standard : image/jpeg, image/png, video/mp4, application/pdf et autres.
Les métadonnées du fichier contiennent des champs système (Content-Type, Cache-Control, Content-Disposition) et des paires clé-valeur personnalisées (customMetadata). Les champs système contrôlent les en-têtes HTTP lors du téléchargement. Par exemple, Cache-Control: public, max-age=31536000 active la mise en cache de la réponse pendant un an, ce qui réduit considérablement les téléchargements répétés du même fichier et économise le trafic.
Les métadonnées personnalisées sont pratiques pour transmettre des informations supplémentaires sur un fichier sans créer une collection séparée dans Firestore. Par exemple, le champ uploadedBy peut stocker l'userId de l'utilisateur qui a téléversé, ce qui simplifie l'implémentation de galeries avec du contenu généré par l'utilisateur. Les métadonnées personnalisées ne sont pas protégées séparément par Security Rules — leur accès est régi par les mêmes règles que le fichier lui-même.
Lorsque vous devez téléverser plusieurs fichiers simultanément (par exemple, des photos d'une galerie), il n'est pas recommandé d'exécuter des UploadTasks indépendants en parallèle sans limites. Sur les appareils mobiles, les téléversements parallèles de plus de 3 à 5 fichiers surchargent la pile réseau et provoquent des délais d'attente. La stratégie optimale consiste à utiliser une limite de concurrence de 3 ou un téléversement séquentiel avec une barre de progression partagée.
Pour le traitement côté serveur après le téléversement (génération de miniatures, compression, modération de contenu), utilisez le déclencheur Firebase Cloud Functions : functions.storage.object().onFinalize(). Cette fonction est appelée automatiquement après chaque téléversement de fichier et peut enregistrer une copie traitée sous un chemin différent. Plus de détails dans la section des cas d'utilisation typiques.
Firebase Storage prend en charge deux méthodes de téléchargement : le téléchargement direct via le SDK (obtention d'un tableau d'octets ou d'un fichier local) et l'obtention d'une URL de téléchargement direct pour un accès HTTP. L'URL directe peut être utilisée pour afficher des images dans ImageView, dans WebView, ou pour fournir un lien à l'utilisateur. L'URL de téléchargement est générée avec un jeton de sécurité qui peut être révoqué dans la console Firebase.
La méthode storageReference.downloadUrl renvoie une URL au format https://firebasestorage.googleapis.com/v0/b/{bucket}/o/{path}?alt=media&token={token}. Le jeton de sécurité est automatiquement inclus dans l'URL lors de la génération, donc le lien peut être partagé avec des tiers (par exemple, dans un messager) sans risque d'accès non autorisé. Cependant, si le jeton est compromis, il peut être révoqué via la console Firebase dans la section Storage — après cela, tous les liens avec ce jeton cesseront de fonctionner.
Pour la mise en cache des fichiers téléchargés sur le client, utilisez le stockage local avec le mécanisme ETag ou le hachage MD5. Firebase Storage renvoie un en-tête HTTP ETag lors de la demande d'un fichier, qui peut être comparé à une valeur stockée localement pour éviter de retélécharger les fichiers inchangés. Ceci est particulièrement utile pour le contenu multimédia : avatars, images de couverture, aperçus — des fichiers rarement mis à jour mais fréquemment demandés.
Une URL de téléchargement avec un jeton est le moyen principal de fournir un accès aux fichiers aux utilisateurs non authentifiés (par exemple, pour afficher une image dans un fil d'actualités). Le jeton est généré une fois et ne change pas jusqu'à sa révocation, donc l'URL peut être stockée dans une base de données (par exemple, à côté du champ avatarUrl dans Firestore). Lorsque l'avatar est modifié, l'ancien fichier est supprimé et une nouvelle URL est générée et sauvegardée.
Il est important de se rappeler : avoir une URL de téléchargement n'annule pas les Security Rules. Si une règle refuse la lecture du fichier, la méthode downloadUrl renverra une erreur d'autorisation refusée. Cela signifie que même en connaissant le chemin correct du fichier, un client non authentifié ne peut pas obtenir le lien. Une fois obtenue, l'URL fournit un accès HTTP contournant Security Rules — donc le jeton est la seule protection du lien de téléchargement.
HTTP ETag est un identifiant de version de fichier qui change à chaque modification du contenu. Firebase Storage renvoie automatiquement un ETag dans la réponse GET. L'application cliente peut stocker l'ETag dans un cache local et envoyer l'en-tête If-None-Match: {etag} lors des requêtes suivantes. Si le fichier n'a pas changé, le serveur renvoie un statut 304 Non modifié sans transmettre de données.
Pour implémenter une mise en cache intelligente dans une application mobile, utilisez une combinaison du système de fichiers local et d'une base de données (par exemple, Room pour stocker les paires chemin-ETag). Lors du chargement d'un fichier, vérifiez l'ETag dans la base de données : s'il correspond à celui du serveur, utilisez la copie locale. Cette approche réduit le trafic de 60 à 80 % pour les fichiers multimédia statiques et accélère le chargement des écrans avec des galeries.
Security Rules est un langage déclaratif de contrôle d'accès pour les fichiers dans Firebase Storage, exécuté côté serveur Firebase. Chaque règle est liée à un chemin de bucket et définit les conditions dans lesquelles une opération de lecture ou d'écriture est autorisée. Les règles sont vérifiées avant chaque requête et ne peuvent pas être contournées par le code client. C'est la seule ligne de défense des données contre les accès non autorisés.
La règle de base est accès uniquement aux utilisateurs authentifiés : allow read, write: if request.auth != null. Cette règle garantit que seuls les utilisateurs connectés peuvent lire et écrire des fichiers. Pour une configuration plus fine, la variable request.auth.uid est utilisée, contenant l'identifiant de l'utilisateur actuel. En comparant l'uid avec une partie du chemin du fichier, vous pouvez créer un stockage isolé pour chaque utilisateur.
Important : Security Rules n'est pas un mécanisme de validation de contenu. Si vous devez vérifier le type de fichier, la taille ou la présence de code malveillant, utilisez la règle request.resource, qui contient les métadonnées du fichier téléversé. Les propriétés disponibles sont request.resource.size (taille du fichier), request.resource.contentType (type MIME) et request.resource.md5Hash (somme de contrôle). Cependant, la validation complète du contenu est effectuée côté serveur via Cloud Functions.
| Scénario | Règle Security Rules |
|---|---|
| Authentifiés uniquement | allow read, write: if request.auth != null |
| Propriétaire uniquement | allow write: if request.auth.uid == userId |
| Lecture publique | allow read: if true; allow write: if request.auth != null |
| Limite de taille | allow write: if request.resource.size < 5 * 1024 * 1024 |
| Limite de type | allow write: if request.resource.contentType.startsWith('image/') |
Une configuration typique pour une application avec avatars utilisateur et galerie se présente comme suit. L'utilisateur ne peut écrire que dans son propre répertoire /users/{userId}/, mais peut lire n'importe quel fichier dans ce répertoire (galerie publique). La taille du fichier est limitée à 5 Mo et le type est limité aux images uniquement. Cette combinaison de règles couvre 80 % des cas d'utilisation de Firebase Storage dans les applications sociales et UGC.
Conseil de sécurité : n'utilisez jamais la règle allow read, write: if true pour l'ensemble du bucket. Cela ouvre l'accès en écriture à quiconque connaît votre projectId. En 2025, les attaques sur les buckets Firebase non protégés ont augmenté, les attaquants utilisant l'accès ouvert pour stocker du contenu illégal. Commencez toujours par les autorisations minimales nécessaires et ne les étendez que lorsque cela est explicitement nécessaire.
Le déclencheur Cloud Functions functions.storage.object().onFinalize() permet d'effectuer une validation du contenu après le téléversement. Si le fichier ne passe pas la validation (par exemple, contient un virus ou enfreint les règles de la plateforme), la fonction peut le supprimer et notifier l'utilisateur. C'est la seule façon de vérifier le contenu réel, car Security Rules ne voit que les métadonnées (taille et type MIME), pas les données binaires.
Exemple de validation : une fonction Node.js télécharge le fichier téléversé dans un répertoire temporaire, l'exécute via un détecteur antivirus (par exemple, ClamAV), et si une menace est trouvée — supprime le fichier et enregistre l'événement dans Firebase Crashlytics. Le temps d'exécution de la fonction est limité à 540 secondes, ce qui est suffisant pour vérifier des fichiers jusqu'à 50 Mo.
Voyons des exemples pratiques d'intégration de Firebase Storage dans une application Android utilisant Kotlin. Le code utilise les classes standard du SDK Firebase et démontre le téléversement d'une image depuis la galerie de l'appareil, le téléchargement d'un fichier avec suivi de progression et l'obtention d'une URL de téléchargement. Tous les exemples incluent la gestion des erreurs et la suspension des tâches en cas de perte de connexion.
Avant d'utiliser le code, assurez-vous que le fichier build.gradle inclut la dépendance implementation(platform("com.google.firebase:firebase-bom:33.0.0")) et implementation("com.google.firebase:firebase-storage"). Firebase BOM sélectionne automatiquement les versions compatibles de tous les SDK, éliminant les conflits de versions.
Le premier exemple montre le téléversement d'un fichier sélectionné par l'utilisateur via l'intention ACTION_GET_CONTENT. L'URI du fichier obtenu est passé au SDK Firebase Storage, qui lit les données de cette URI. La méthode putFile accepte une URI et renvoie un UploadTask — un objet via lequel vous pouvez suivre la progression, mettre en pause et reprendre le téléversement.
val storageRef = Firebase.storage.reference
val imageRef = storageRef.child(
"users/${auth.uid}/profile.jpg"
)
val metadata = SettableMetadata().apply {
contentType = "image/jpeg"
customMetadata = mapOf(
"uploadedBy" to auth.uid!!
)
}
imageRef.putFile(imageUri, metadata)
.addOnSuccessListener {
Log.d("Storage", "Fichier téléversé")
}
.addOnFailureListener { e ->
Log.e("Storage", "Erreur : ${e.message}")
}
Dans l'exemple ci-dessus, la variable storageRef est la référence racine au bucket du projet. La méthode child accepte une chaîne de chemin et renvoie une StorageReference pointant vers un fichier spécifique. Si un fichier existe déjà au chemin spécifié, il sera écrasé. Les métadonnées contentType et customMetadata sont transmises via l'objet SettableMetadata, qui est attaché à la requête putFile.
Le deuxième exemple montre le téléchargement d'un fichier en obtenant un tableau d'octets pour l'affichage dans un ImageView. La méthode getBytes(maxSize) charge le fichier entier en mémoire. Pour les fichiers de plus de 10 Mo, utilisez getFile(localUri) — il sauvegarde le contenu directement dans un fichier local sans le stocker dans la RAM, évitant OutOfMemoryError.
val islandRef = storageRef.child("images/island.jpg")
val ONE_MEGABYTE: Long = 1024 * 1024
islandRef.getBytes(ONE_MEGABYTE)
.addOnSuccessListener { bytes ->
imageView.setImageBitmap(
BitmapFactory.decodeByteArray(
bytes, 0, bytes.size
)
)
}
.addOnFailureListener { e ->
Log.e("Storage", "Échec du téléversement : ${e.message}")
}
Pour obtenir une URL de téléchargement (par exemple, pour sauvegarder le lien dans Firestore), utilisez la méthode downloadUrl :
islandRef.downloadUrl.addOnSuccessListener { uri ->
Log.d("Storage", "URL de téléchargement : $uri")
// Sauvegarder uri.toString() dans Firestore
}
Conseil : l'URL de téléchargement est générée une fois et reste stable jusqu'à sa révocation. Sauvegardez-la dans la base de données lors du premier téléversement plutôt que de la demander à chaque affichage du fichier. Cela réduit le nombre de requêtes vers Firebase Storage et améliore les performances de l'interface utilisateur.
Firebase Storage est utilisé dans les applications mobiles pour stocker tous les fichiers utilisateur et système. Les scénarios les plus courants incluent les avatars et photos de profil, les images dans les flux de contenu, les fichiers vidéo et audio, les documents (PDF, DOCX) pour le partage entre utilisateurs et la sauvegarde de données à petite échelle. Dans tous ces cas, Storage agit comme un stockage de fichiers spécialisé en conjonction avec Firestore pour stocker les métadonnées et les liens.
Les applications sociales sont le cas d'utilisation le plus courant. Chaque utilisateur téléverse un avatar, des photos de publications et des fichiers multimédias. La structure des chemins /users/{uid}/posts/{postId}/image.jpg isole les données et simplifie les Security Rules. Lorsqu'un utilisateur est supprimé, une Cloud Function peut parcourir tous les répertoires de l'utilisateur et nettoyer le stockage. Selon le blog Firebase (2025), ce modèle est utilisé dans 70 % des projets Firebase en production.
Les applications e-commerce utilisent Firebase Storage pour stocker les photos de produits, les catalogues et les fichiers PDF avec instructions. Dans ce cas, l'accès aux fichiers est généralement public (lecture sans authentification), tandis que l'écriture est restreinte aux administrateurs via Cloud Functions avec vérification des autorisations. Les URL de téléchargement des produits sont stockées dans Firestore à côté des autres données du produit, permettant d'afficher les images sans requêtes supplémentaires à Storage.
Les messageries et chats stockent les images et messages vocaux envoyés dans les conversations dans Firebase Storage. Le chemin est structuré comme /chats/{chatId}/messages/{messageId}.jpg. L'accès en lecture est limité aux participants du chat, vérifié via Security Rules en utilisant les données de Firestore. C'est l'un des rares scénarios où une règle lit les données d'un autre service Firebase : allow read: if firestore.exists(/databases/(default)/documents/chats/{chatId}/members/{request.auth.uid}).
Questions fréquentes
Firebase Storage est une surcouche de Google Cloud Storage avec intégration de Firebase Authentication et Security Rules. Le développeur n'a pas besoin de configurer des rôles IAM et des comptes de service. Google Cloud Storage offre des capacités plus larges (notifications Pub/Sub, Object Lifecycle Management) mais nécessite une gestion manuelle des accès via GCP IAM.
La limite de taille est définie dans les Security Rules via request.resource.size. Exemple : allow write: if request.resource.size <= 5 * 1024 * 1024 limite les fichiers à 5 Mo. De plus, vous pouvez vérifier côté client avant l'envoi pour ne pas gaspiller le trafic de l'utilisateur avec des fichiers manifestement invalides.
Oui, la suppression se fait avec la méthode delete() de l'objet StorageReference : storageRef.child("path").delete(). L'opération de suppression est irréversible et supprime le fichier du bucket immédiatement. Un fichier ne peut être supprimé que si Security Rules autorise l'écriture pour le chemin donné. Après la suppression, l'URL de téléchargement cesse de fonctionner.
Dans les Security Rules, autorisez la lecture pour tous (ou utilisateurs authentifiés) et refusez l'écriture : allow read: if request.auth != null; allow write: if false. L'écriture dans ce mode n'est possible que via le compte de service Firebase Admin SDK — par exemple, depuis Cloud Functions avec privilèges administratifs. C'est le modèle standard pour les catalogues de produits et le contenu public.
UploadTask utilise le protocole de téléversement reprenable basé sur HTTP PUT avec segmentation. Lorsqu'une connexion est interrompue, le téléversement reprend à partir du dernier octet confirmé, pas depuis le début. Aucune configuration supplémentaire n'est requise pour ce comportement — le SDK le fait automatiquement pour les fichiers de plus de 1 Mo.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi