Работа с S3 и облачными хранилищами в C# (.NET): библиотека AWS SDK

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с S3 и облачными хранилищами в C# (.NET)

Современные облачные технологии требуют надежного хранения и управления данными. Одним из стандартов де-факто для объектного хранения является протокол Amazon S3 (Simple Storage Service). В экосистеме C# (.NET) для работы с S3 и любыми S3-совместимыми хранилищами (Yandex Object Storage, MinIO, DigitalOcean Spaces, VK Cloud) используется официальная библиотека AWS SDK for .NET (пакет AWSSDK.S3).

В этой статье мы подробно разберем, как подключить библиотеку, настроить клиент, выполнить базовые операции (загрузка, скачивание, удаление, листинг) и адаптировать код для работы с локальными S3-эмуляторами, такими как MinIO.

Установка библиотеки

Для начала добавьте NuGet-пакет в ваш проект:

dotnet add package AWSSDK.S3

Или через менеджер пакетов Visual Studio:

Install-Package AWSSDK.S3

Создание и настройка S3-клиента

Библиотека предоставляет класс AmazonS3Client, который можно настроить для работы с любым S3-совместимым хранилищем. Рассмотрим два варианта: подключение к Amazon S3 и к локальному MinIO.

Подключение к Amazon S3

using Amazon;
using Amazon.S3;
using Amazon.Runtime;

var credentials = new BasicAWSCredentials("ваш_ACCESS_KEY", "ваш_SECRET_KEY");
var config = new AmazonS3Config
{
    RegionEndpoint = RegionEndpoint.EUWest1 // или другой регион
};

using var client = new AmazonS3Client(credentials, config);

Подключение к MinIO (локальный S3-сервер)

using Amazon.S3;
using Amazon.Runtime;

var credentials = new BasicAWSCredentials("minioadmin", "minioadmin");
var config = new AmazonS3Config
{
    ServiceURL = "http://localhost:9000", // адрес MinIO
    ForcePathStyle = true,                // обязательно для MinIO
    UseHttp = true
};

using var client = new AmazonS3Client(credentials, config);

Основные операции с S3

Все операции выполняются асинхронно через методы клиента. Рассмотрим ключевые сценарии.

1. Загрузка файла (Upload)

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($"Файл загружен. ETag: {response.ETag}");
}

2. Скачивание файла (Download)

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($"Файл сохранен в {downloadPath}");
}

3. Удаление файла (Delete)

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($"Файл удален. HTTP статус: {response.HttpStatusCode}");
}

4. Получение списка файлов (List Objects)

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 response.S3Objects)
        {
            Console.WriteLine($"Ключ: {obj.Key}, Размер: {obj.Size} байт, Последнее изменение: {obj.LastModified}");
        }
        
        request.ContinuationToken = response.NextContinuationToken;
    } while (response.IsTruncated);
}

5. Работа с потоками (Stream)

Если вы работаете не с файлами, а с данными в памяти, используйте InputStream:

public async Task UploadStreamAsync(IAmazonS3 client, string bucketName, string key, Stream dataStream)
{
    var request = new PutObjectRequest
    {
        BucketName = bucketName,
        Key = key,
        InputStream = dataStream
    };

    await client.PutObjectAsync(request);
}

Работа с несколькими бакетами

Вы можете создавать и удалять бакеты программно:

public async Task                    

Рекомендаций