Introduction à S3 et aux stockages cloud pour le développeur .NET
Les stockages objets cloud compatibles avec le protocole Amazon S3 (Simple Storage Service) sont devenus le standard de facto pour le stockage de données non structurées : images, vidéos, sauvegardes, logs et artefacts de build. Dans l'écosystème C# (.NET), le travail avec ces stockages est réalisé via le AWS SDK officiel pour .NET ou via des clients légers pour les solutions compatibles S3 (MinIO, Yandex Object Storage, DigitalOcean Spaces).
Dans cet article, nous allons détailler les opérations principales : connexion, création de bucket, téléchargement (upload), téléchargement (download) et suppression d'objets. Tous les exemples sont écrits en C# avec .NET 8.
Installation de la bibliothèque AWS SDK pour .NET
Pour travailler avec S3 depuis C#, il est nécessaire d'installer le package NuGet AWS SDK for .NET — S3 :
dotnet add package AWSSDK.S3dotnet add package AWSSDK.Extensions.NETCore.Setup // pour l'intégration DISi vous utilisez MinIO ou d'autres stockages compatibles S3 (non AWS), le même package suffit — il prend en charge les endpoints personnalisés.
Configuration de base du client S3
Créons un client pour travailler avec S3. L'exemple ci-dessous utilise MinIO, lancé localement sur le port 9000 :
using Amazon;using Amazon.S3;using Amazon.Runtime;
var config = new AmazonS3Config{ ServiceURL = "http://localhost:9000", // pour MinIO ou un autre stockage compatible S3 ForcePathStyle = true, // obligatoire pour MinIO UseHttp = true};
var credentials = new BasicAWSCredentials("minioadmin", "minioadmin");var s3Client = new AmazonS3Client(credentials, config);Pour AWS S3, il suffit de spécifier la région et d'utiliser les credentials standards :
var s3Client = new AmazonS3Client(RegionEndpoint.EUWest1);Création et suppression d'un bucket
Création d'un bucket
public async Task CreateBucketAsync(string bucketName){ var putBucketRequest = new PutBucketRequest { BucketName = bucketName, UseClientRegion = true }; var response = await s3Client.PutBucketAsync(putBucketRequest); Console.WriteLine($"Bucket {bucketName} créé. Statut HTTP : {response.HttpStatusCode}");}Vérification de l'existence d'un bucket
public async Task<bool> DoesBucketExistAsync(string bucketName){ return await AmazonS3Util.DoesS3BucketExistAsync(s3Client, bucketName);}Suppression d'un bucket
public async Task DeleteBucketAsync(string bucketName){ await s3Client.DeleteBucketAsync(bucketName); Console.WriteLine($"Bucket {bucketName} supprimé.");}Téléchargement de fichiers (Upload)
Le scénario le plus courant est le téléchargement d'un fichier dans un bucket. Utilisons PutObjectAsync :
public async Task UploadFileAsync(string bucketName, string key, string filePath){ var putRequest = new PutObjectRequest { BucketName = bucketName, Key = key, FilePath = filePath, ContentType = "application/octet-stream" };
var response = await s3Client.PutObjectAsync(putRequest); Console.WriteLine($"Fichier {key} téléchargé. ETag : {response.ETag}");}Téléchargement depuis un flux (stream) — utile pour les fichiers reçus de l'utilisateur via un formulaire web :
public async Task UploadFromStreamAsync(string bucketName, string key, Stream inputStream){ var putRequest = new PutObjectRequest { BucketName = bucketName, Key = key, InputStream = inputStream }; await s3Client.PutObjectAsync(putRequest);}Téléchargement de fichiers (Download)
On peut télécharger un objet dans un fichier ou dans un flux :
public async Task DownloadFileAsync(string bucketName, string key, string downloadPath){