مكتبة minio-go للعمل مع S3 والتخزين السحابي في Go
في التطوير الحديث، تظهر الحاجة بشكل متزايد للتكامل مع التخزين السحابي المتوافق مع بروتوكول Amazon S3 (Simple Storage Service). سواء كان AWS S3، أو Yandex.Cloud، أو DigitalOcean Spaces، أو MinIO، أو أي خدمة أخرى متوافقة مع S3، تقدم لغة Go حلاً أنيقاً وفعالاً - مكتبة minio-go.
Minio-go هو عميل Go الرسمي لواجهة برمجة تطبيقات Amazon S3، الذي طورته شركة MinIO. يوفر مجموعة كاملة من الوظائف لإدارة الحاويات والكائنات، ويدعم الرفع/التحميل التدفقي، والتشفير، وإدارة الإصدارات، والعديد من إمكانيات S3 الأخرى. المكتبة متوافقة تماماً مع AWS S3 وأي تخزين آخر متوافق مع S3.
التثبيت
يتم تثبيت المكتبة بالطريقة القياسية عبر go get:
go get github.com/minio/minio-go/v7الاتصال وتكوين العميل
للبدء، يجب إنشاء عميل مع تحديد endpoint و access key و secret key. مثال على الاتصال بـ MinIO (محلي أو سحابي):
package main
import ( "context" "log" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials")
func main() { ctx := context.Background() // معلمات الاتصال endpoint := "play.min.io" // أو endpoint الخاص بك accessKeyID := "Q3AM3UQ867SPQQA43P2F" secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" useSSL := true
// إنشاء العميل client, err := minio.New(endpoint, &minio.Options{ Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""), Secure: useSSL, }) if err != nil { log.Fatalf("خطأ في إنشاء العميل: %v", err) }
log.Println("تم إنشاء الاتصال بالتخزين S3")}العمل مع الحاويات
الحاوية (bucket) هي الدليل الجذر في تخزين S3. دعنا نستعرض العمليات الأساسية:
إنشاء حاوية
bucketName := "my-go-bucket"location := "us-east-1"
err = client.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{ Region: location,})if err != nil { log.Printf("فشل إنشاء الحاوية: %v", err)} else { log.Printf("تم إنشاء الحاوية '%s' بنجاح", bucketName)}التحقق من وجود الحاوية
exists, err := client.BucketExists(ctx, bucketName)if err != nil { log.Fatalf("خطأ في التحقق من الحاوية: %v", err)}if exists { log.Printf("الحاوية '%s' موجودة", bucketName)}قائمة بجميع الحاويات
buckets, err := client.ListBuckets(ctx)if err != nil { log.Fatalf("خطأ في الحصول على قائمة الحاويات: %v", err)}for _, bucket := range buckets { log.Printf("الحاوية: %s، تاريخ الإنشاء: %s", bucket.Name, bucket.CreationDate)}رفع الملفات (upload)
يدعم Minio-go رفع الملفات من نظام الملفات المحلي، ومن io.Reader، ومن المخزن المؤقت في الذاكرة. مثال على رفع ملف:
objectName := "example.txt"filePath := "/path/to/local/file.txt"contentType := "text/plain"
// رفع الملفn, err := client.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{ ContentType: contentType,})if err != nil { log.Fatalf("خطأ في رفع الملف: %v", err)}log.Printf("تم رفع الملف '%s'، الحجم: %d بايت", objectName, n.Size)الرفع من الذاكرة (bytes/reader)
import "strings"
data := strings.NewReader("مرحباً، تخزين S3!")objectName := "hello.txt"
n, err := client.PutObject(ctx, bucketName, objectName, data, int64(data.Len()), minio.PutObjectOptions{ ContentType: "text/plain",})if err != nil { log.Fatalf("خطأ في رفع البيانات: %v", err)}log.Printf("تم رفع %d بايت", n.Size)