Travailler avec S3 et les stockages cloud en C# (.NET)
\n\nLes technologies cloud modernes nécessitent un stockage et une gestion fiables des données. L'un des standards de facto pour le stockage objet est le protocole Amazon S3 (Simple Storage Service). Dans l'écosystème C# (.NET), pour travailler avec S3 et tout stockage compatible S3 (Yandex Object Storage, MinIO, DigitalOcean Spaces, VK Cloud), on utilise la bibliothèque officielle AWS SDK for .NET (package AWSSDK.S3).
Dans cet article, nous allons détailler comment ajouter la bibliothèque, configurer le client, effectuer les opérations de base (téléchargement, téléchargement, suppression, listage) et adapter le code pour fonctionner avec des émulateurs S3 locaux comme MinIO.
\n\nInstallation de la bibliothèque
\n\nPour commencer, ajoutez le package NuGet à votre projet :
\n\ndotnet add package AWSSDK.S3\n\nOu via le gestionnaire de packages Visual Studio :
\n\nInstall-Package AWSSDK.S3\n\nCréation et configuration du client S3
\n\nLa bibliothèque fournit la classe AmazonS3Client, qui peut être configurée pour fonctionner avec tout stockage compatible S3. Examinons deux options : la connexion à Amazon S3 et à MinIO local.
Connexion à Amazon S3
\n\nusing Amazon;\nusing Amazon.S3;\nusing Amazon.Runtime;\n\nvar credentials = new BasicAWSCredentials("votre_ACCESS_KEY", "votre_SECRET_KEY");\nvar config = new AmazonS3Config\n{\n RegionEndpoint = RegionEndpoint.EUWest1 // ou une autre région\n};\n\nusing var client = new AmazonS3Client(credentials, config);\n\nConnexion à MinIO (serveur S3 local)
\n\nusing Amazon.S3;\nusing Amazon.Runtime;\n\nvar credentials = new BasicAWSCredentials("minioadmin", "minioadmin");\nvar config = new AmazonS3Config\n{\n ServiceURL = "http://localhost:9000", // adresse de MinIO\n ForcePathStyle = true, // obligatoire pour MinIO\n UseHttp = true\n};\n\nusing var client = new AmazonS3Client(credentials, config);\n\nOpérations principales avec S3
\n\nToutes les opérations sont effectuées de manière asynchrone via les méthodes du client. Examinons les scénarios clés.
\n\n1. Téléchargement d'un fichier (Upload)
\n\nusing Amazon.S3;\nusing Amazon.S3.Model;\n\npublic async Task UploadFileAsync(IAmazonS3 client, string bucketName, string filePath, string key)\n{\n var request = new PutObjectRequest\n {\n BucketName = bucketName,\n Key = key,\n FilePath = filePath\n };\n\n var response = await client.PutObjectAsync(request);\n Console.WriteLine($"Fichier téléchargé. ETag : {response.ETag}");\n}\n\n2. Téléchargement d'un fichier (Download)
\n\npublic async Task DownloadFileAsync(IAmazonS3 client, string bucketName, string key, string downloadPath)\n{\n var request = new GetObjectRequest\n {\n BucketName = bucketName,\n Key = key\n };\n\n using var response = await client.GetObjectAsync(request);\n await response.WriteResponseStreamToFileAsync(downloadPath, false, CancellationToken.None);\n Console.WriteLine($"Fichier sauvegardé dans {downloadPath}");\n}\n\n3. Suppression d'un fichier (Delete)
\n\npublic async Task DeleteFileAsync(IAmazonS3 client, string bucketName, string key)\n{\n var request = new DeleteObjectRequest\n {\n BucketName = bucketName,\n Key = key\n };\n\n var response = await client.DeleteObjectAsync(request);\n Console.WriteLine($"Fichier supprimé. Statut HTTP : {response.HttpStatusCode}");\n}\n\n4. Obtention de la liste des fichiers (List Objects)
\n\npublic async Task ListFilesAsync(IAmazonS3 client, string bucketName)\n{\n var request = new ListObjectsV2Request\n {\n BucketName = bucketName,\n MaxKeys = 100\n };\n\n ListObjectsV2Response response;\n do\n {\n response = await client.ListObjectsV2Async(request);\n \n foreach (var obj in respo