العمل مع S3 والتخزين السحابي في C# (.NET): AWS SDK و MinIO

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة إلى S3 والتخزين السحابي لمطور .NET



أصبحت مخازن الكائنات السحابية المتوافقة مع بروتوكول Amazon S3 (Simple Storage Service) المعيار الفعلي لتخزين البيانات غير المهيكلة: الصور، الفيديوهات، النسخ الاحتياطية، السجلات، وقطع البناء. في نظام C# (.NET)، يتم العمل مع هذه المخازن من خلال AWS SDK الرسمي لـ .NET أو من خلال عملاء خفيفين للحلول المتوافقة مع S3 (MinIO، Yandex Object Storage، DigitalOcean Spaces).



في هذه المقالة، سنستعرض العمليات الأساسية: الاتصال، إنشاء حاوية، تحميل، تنزيل، وحذف الكائنات. جميع الأمثلة مكتوبة بلغة C# باستخدام .NET 8.



تثبيت مكتبة AWS SDK لـ .NET



للعمل مع S3 من C#، يجب تثبيت حزمة NuGet AWS SDK for .NET — S3:



dotnet add package AWSSDK.S3dotnet add package AWSSDK.Extensions.NETCore.Setup  // لتكامل DI


إذا كنت تستخدم MinIO أو مخازن أخرى متوافقة مع S3 (غير AWS)، فإن نفس الحزمة كافية - فهي تدعم نقاط النهاية المخصصة.



الإعداد الأساسي لعميل S3



لنقم بإنشاء عميل للعمل مع S3. في المثال أدناه، يتم استخدام MinIO الذي يعمل محلياً على المنفذ 9000:



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

var config = new AmazonS3Config{ ServiceURL = "http://localhost:9000", // لـ MinIO أو أي مخزن متوافق مع S3 ForcePathStyle = true, // إجباري لـ MinIO UseHttp = true};

var credentials = new BasicAWSCredentials("minioadmin", "minioadmin");var s3Client = new AmazonS3Client(credentials, config);


بالنسبة لـ AWS S3، يكفي تحديد المنطقة واستخدام بيانات الاعتماد القياسية:



var s3Client = new AmazonS3Client(RegionEndpoint.EUWest1);


إنشاء وحذف الحاوية (bucket)



إنشاء حاوية



public async Task CreateBucketAsync(string bucketName){    var putBucketRequest = new PutBucketRequest    {        BucketName = bucketName,        UseClientRegion = true    };    var response = await s3Client.PutBucketAsync(putBucketRequest);    Console.WriteLine($"تم إنشاء الحاوية {bucketName}. حالة HTTP: {response.HttpStatusCode}");}


التحقق من وجود الحاوية



public async Task<bool> DoesBucketExistAsync(string bucketName){    return await AmazonS3Util.DoesS3BucketExistAsync(s3Client, bucketName);}


حذف الحاوية



public async Task DeleteBucketAsync(string bucketName){    await s3Client.DeleteBucketAsync(bucketName);    Console.WriteLine($"تم حذف الحاوية {bucketName}.");}


تحميل الملفات (Upload)



السيناريو الأكثر شيوعاً هو تحميل ملف إلى الحاوية. نستخدم 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($"تم تحميل الملف {key}. ETag: {response.ETag}");}


التحميل من تيار (stream) - مفيد للملفات المستلمة من المستخدم عبر نموذج ويب:



public async Task UploadFromStreamAsync(string bucketName, string key, Stream inputStream){    var putRequest = new PutObjectRequest    {        BucketName = bucketName,        Key = key,        InputStream = inputStream    };    await s3Client.PutObjectAsync(putRequest);}


تنزيل الملفات (Download)



يمكن تنزيل الكائن إلى ملف أو إلى تيار:



public async Task DownloadFileAsync(string bucketName, string key, string downloadPath){                    

توصيات