العمل مع S3 والتخزين السحابي في C# (.NET)
\n\nتتطلب التقنيات السحابية الحديثة تخزينًا موثوقًا وإدارة فعالة للبيانات. أحد المعايير الفعلية للتخزين الكائني هو بروتوكول Amazon S3 (خدمة التخزين البسيطة). في بيئة C# (.NET)، للعمل مع S3 وأي تخزين متوافق مع S3 (Yandex Object Storage، MinIO، DigitalOcean Spaces، VK Cloud)، يتم استخدام المكتبة الرسمية AWS SDK for .NET (الحزمة AWSSDK.S3).
في هذه المقالة، سنشرح بالتفصيل كيفية توصيل المكتبة، إعداد العميل، تنفيذ العمليات الأساسية (رفع، تنزيل، حذف، سرد) وتكييف الكود للعمل مع محاكيات S3 المحلية مثل MinIO.
\n\nتثبيت المكتبة
\n\nللبدء، أضف حزمة NuGet إلى مشروعك:
\n\ndotnet add package AWSSDK.S3\n\nأو عبر مدير الحزم في Visual Studio:
\n\nInstall-Package AWSSDK.S3\n\nإنشاء وتكوين عميل S3
\n\nتوفر المكتبة الفئة AmazonS3Client، والتي يمكن تكوينها للعمل مع أي تخزين متوافق مع S3. سننظر في خيارين: الاتصال بـ Amazon S3 و MinIO المحلي.
الاتصال بـ Amazon S3
\n\nusing Amazon;\nusing Amazon.S3;\nusing Amazon.Runtime;\n\nvar credentials = new BasicAWSCredentials("مفتاح_الوصول_الخاص_بك", "مفتاح_السري_الخاص_بك");\nvar config = new AmazonS3Config\n{\n RegionEndpoint = RegionEndpoint.EUWest1 // أو منطقة أخرى\n};\n\nusing var client = new AmazonS3Client(credentials, config);\n\nالاتصال بـ MinIO (خادم S3 محلي)
\n\nusing Amazon.S3;\nusing Amazon.Runtime;\n\nvar credentials = new BasicAWSCredentials("minioadmin", "minioadmin");\nvar config = new AmazonS3Config\n{\n ServiceURL = "http://localhost:9000", // عنوان MinIO\n ForcePathStyle = true, // إلزامي لـ MinIO\n UseHttp = true\n};\n\nusing var client = new AmazonS3Client(credentials, config);\n\nالعمليات الأساسية مع S3
\n\nيتم تنفيذ جميع العمليات بشكل غير متزامن عبر طرق العميل. سننظر في السيناريوهات الرئيسية.
\n\n1. رفع ملف (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($"تم رفع الملف. ETag: {response.ETag}");\n}\n\n2. تنزيل ملف (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($"تم حفظ الملف في {downloadPath}");\n}\n\n3. حذف ملف (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($"تم حذف الملف. حالة HTTP: {response.HttpStatusCode}");\n}\n\n4. الحصول على قائمة الملفات (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