Trabalho com S3 e armazenamentos em nuvem em C# (.NET)
As tecnologias modernas de nuvem exigem armazenamento e gerenciamento confiáveis de dados. Um dos padrões de fato para armazenamento de objetos é o protocolo Amazon S3 (Simple Storage Service). No ecossistema C# (.NET), para trabalhar com S3 e qualquer armazenamento compatível com S3 (Yandex Object Storage, MinIO, DigitalOcean Spaces, VK Cloud), utiliza-se a biblioteca oficial AWS SDK for .NET (pacote AWSSDK.S3).
Neste artigo, vamos detalhar como conectar a biblioteca, configurar o cliente, realizar operações básicas (upload, download, exclusão, listagem) e adaptar o código para funcionar com emuladores S3 locais, como o MinIO.
Instalação da biblioteca
Para começar, adicione o pacote NuGet ao seu projeto:
dotnet add package AWSSDK.S3Ou através do gerenciador de pacotes do Visual Studio:
Install-Package AWSSDK.S3Criação e configuração do cliente S3
A biblioteca fornece a classe AmazonS3Client, que pode ser configurada para funcionar com qualquer armazenamento compatível com S3. Vamos considerar duas opções: conexão ao Amazon S3 e ao MinIO local.
Conexão ao Amazon S3
using Amazon;using Amazon.S3;using Amazon.Runtime;
var credentials = new BasicAWSCredentials("seu_ACCESS_KEY", "seu_SECRET_KEY");var config = new AmazonS3Config{ RegionEndpoint = RegionEndpoint.EUWest1 // ou outra região};
using var client = new AmazonS3Client(credentials, config);Conexão ao MinIO (servidor S3 local)
using Amazon.S3;using Amazon.Runtime;
var credentials = new BasicAWSCredentials("minioadmin", "minioadmin");var config = new AmazonS3Config{ ServiceURL = "http://localhost:9000", // endereço do MinIO ForcePathStyle = true, // obrigatório para MinIO UseHttp = true};
using var client = new AmazonS3Client(credentials, config);Operações principais com S3
Todas as operações são executadas de forma assíncrona através dos métodos do cliente. Vamos considerar os cenários principais.
1. Upload de arquivo
using Amazon.S3;using Amazon.S3.Model;
public async Task UploadFileAsync(IAmazonS3 client, string bucketName, string filePath, string key){ var request = new PutObjectRequest { BucketName = bucketName, Key = key, FilePath = filePath };
var response = await client.PutObjectAsync(request); Console.WriteLine($"Arquivo enviado. ETag: {response.ETag}");}2. Download de arquivo
public async Task DownloadFileAsync(IAmazonS3 client, string bucketName, string key, string downloadPath){ var request = new GetObjectRequest { BucketName = bucketName, Key = key };
using var response = await client.GetObjectAsync(request); await response.WriteResponseStreamToFileAsync(downloadPath, false, CancellationToken.None); Console.WriteLine($"Arquivo salvo em {downloadPath}");}3. Exclusão de arquivo
public async Task DeleteFileAsync(IAmazonS3 client, string bucketName, string key){ var request = new DeleteObjectRequest { BucketName = bucketName, Key = key };
var response = await client.DeleteObjectAsync(request); Console.WriteLine($"Arquivo excluído. Status HTTP: {response.HttpStatusCode}");}4. Listagem de arquivos
public async Task ListFilesAsync(IAmazonS3 client, string bucketName){ var request = new ListObjectsV2Request { BucketName = bucketName, MaxKeys = 100 };
ListObjectsV2Response response; do { response = await client.ListObjectsV2Async(request); foreach (var obj in respo