Работа с 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 Также в библиотеке
Работа с Markdown в C++: библиотеки, парсеры и инструменты
Обработка изображений на Java: изменение размера и обрезка (resize, crop)
TipKit для Swift: полное руководство с примерами
PDF генерация в TypeScript: библиотеки, инструменты и примеры кода
Тестирование в Kotlin: фреймворки и инструменты для качественного кода