package s3store import ( "allapp-go/internal/config" "context" "fmt" "io" "net/url" "strings" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" ) var S3Client *s3.Client var presignClient *s3.PresignClient var bucket string func NewS3Client(cfg *config.Config) { credProvider := credentials.NewStaticCredentialsProvider( cfg.AwsS3.AccessKey, cfg.AwsS3.SecretKey, "", ) awsCfg := aws.Config{ Region: cfg.AwsS3.Region, Credentials: credProvider, } S3Client = s3.NewFromConfig(awsCfg, func(o *s3.Options) { o.BaseEndpoint = aws.String(cfg.AwsS3.Endpoint) o.UsePathStyle = true }) presignClient = s3.NewPresignClient(S3Client) bucket = cfg.AwsS3.Bucket fmt.Println("S3 client and Presign client initialized successfully!") } // UploadToRustFS 上传 func UploadToRustFS(ctx context.Context, file io.Reader, key string, size int64, contentType string) error { _, err := S3Client.PutObject(ctx, &s3.PutObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key), Body: file, ContentLength: aws.Int64(size), ContentType: aws.String(contentType), }) return err } func CopyObject(ctx context.Context, sourceKey string, targetKey string) error { source := strings.ReplaceAll(url.PathEscape(fmt.Sprintf("%s/%s", bucket, sourceKey)), "%2F", "/") _, err := S3Client.CopyObject(ctx, &s3.CopyObjectInput{ Bucket: aws.String(bucket), CopySource: aws.String(source), Key: aws.String(targetKey), }) return err } // DeleteFromRustFS 删除 func DeleteFromRustFS(ctx context.Context, key string) error { _, err := S3Client.DeleteObject(ctx, &s3.DeleteObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key), }) return err } func DeleteBatch(ctx context.Context, keys []string) error { const maxBatch = 1000 for i := 0; i < len(keys); i += maxBatch { end := i + maxBatch if end > len(keys) { end = len(keys) } var objects []types.ObjectIdentifier for _, k := range keys[i:end] { objects = append(objects, types.ObjectIdentifier{ Key: aws.String(k), }) } _, err := S3Client.DeleteObjects(ctx, &s3.DeleteObjectsInput{ Bucket: aws.String(bucket), Delete: &types.Delete{ Objects: objects, Quiet: aws.Bool(false), // 返回删除结果(建议保留) }, }) if err != nil { return err // 整批失败才返回 } } return nil }