العمل مع S3 والتخزين السحابي في Java باستخدام AWS SDK و MinIO
\n\nأصبحت التخزينات الكائنية السحابية المتوافقة مع بروتوكول Amazon S3 (Simple Storage Service) المعيار الفعلي لتخزين البيانات غير المهيكلة: الصور، الفيديوهات، السجلات، النسخ الاحتياطية، وقطع البناء. في Java، الأداة الرئيسية للتفاعل مع هذه التخزينات هي AWS SDK for Java (وحدة S3). ومع ذلك، للتطوير المحلي، الاختبار، أو العمل مع الحلول المستضافة ذاتيًا، غالبًا ما يُستخدم MinIO - وهو تخزين عالي الأداء متوافق مع S3 مع عميل Java خاص به. في هذه المقالة، سننظر في كلا النهجين.
\n\n1. التحضير وإضافة التبعيات
\n\nللبدء، أضف التبعيات إلى ملف pom.xml الخاص بك (Maven):
<dependency>\n <groupId>software.amazon.awssdk</groupId>\n <artifactId>s3</artifactId>\n <version>2.30.0</version>\n</dependency>\n\n<!-- لـ MinIO (بديل AWS SDK) -->\n<dependency>\n <groupId>io.minio</groupId>\n <artifactId>minio</artifactId>\n <version>8.5.17</version>\n</dependency>\n\n2. إنشاء عميل S3
\n\nسننظر في طريقتين لإنشاء العميل: لـ Amazon S3 (AWS) ولـ MinIO (تخزين محلي/مخصص).
\n\n2.1. عميل لـ Amazon S3 (AWS SDK)
\n\nاستخدم الباني الثابت (static builder)، مع تحديد المنطقة وطريقة المصادقة (على سبيل المثال، عبر متغيرات البيئة أو ملف تعريف IAM).
\n\nimport software.amazon.awssdk.regions.Region;\nimport software.amazon.awssdk.services.s3.S3Client;\n\npublic class AwsS3Example {\n public static S3Client createAwsS3Client() {\n return S3Client.builder()\n .region(Region.EU_CENTRAL_1) // فرانكفورت\n .build(); // يستخدم سلسلة المزودين الافتراضية\n }\n}\n\n2.2. عميل لـ MinIO
\n\nيتطلب MinIO تحديد endpoint و access key و secret key بشكل صريح.
\n\nimport io.minio.MinioClient;\n\npublic class MinioExample {\n public static MinioClient createMinioClient() {\n return MinioClient.builder()\n .endpoint("http://localhost:9000")\n .credentials("minioadmin", "minioadmin")\n .build();\n }\n}\n\n3. العمليات الأساسية مع الحاويات والكائنات
\n\nبغض النظر عن العميل المختار، فإن منطق العمل مع S3 عالمي. سننظر في السيناريوهات الرئيسية.
\n\n3.1. التحقق من وجود الحاوية وإنشائها
\n\n// AWS SDK\npublic boolean bucketExists(S3Client s3, String bucketName) {\n return s3.headBucket(HeadBucketRequest.builder()\n .bucket(bucketName)\n .build())\n .sdkHttpResponse().isSuccessful();\n}\n\n// MinIO SDK\npublic boolean bucketExists(MinioClient minio, String bucketName) {\n return minio.bucketExists(BucketExistsArgs.builder()\n .bucket(bucketName)\n .build());\n}\n\n// إنشاء حاوية (AWS)\ns3.createBucket(CreateBucketRequest.builder()\n .bucket("my-unique-bucket-123")\n .createBucketConfiguration(\n CreateBucketConfiguration.builder()\n .locationConstraint("eu-central-1")\n .build())\n .build());\n\n// إنشاء حاوية (MinIO)\nminio.makeBucket(MakeBucketArgs.builder()\n .bucket("my-local-bucket")\n .build());\n\n3.2. تحميل ملف (Upload)
\n\nتحميل ملف من مسار محلي أو من تدفق بيانات.
\n\n// AWS SDK - من ملف\ns3.putObject(PutObjectRequest.builder()\n .bucket("my-bucket")\n .key("uploads/report.pdf")\n .build(),\n Paths.get("/local/path/report.pdf"));\n\n// MinIO SDK - من InputStream\ntry (InputStream is = new FileInputStream("/local/path/photo.jpg")) {\n minio.putObject(PutObjectArgs.builder()\n