package storage import ( "context" "sync" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/pkg/errors" "github.com/tamakyi/TamaBox/internal/conf" ) var ( s3ClientOnce sync.Once s3Client *s3.Client s3ClientErr error ossClientOnce sync.Once ossBucket *oss.Bucket ossClientErr error ) // GetS3Client 返回共享的 S3 客户端(单例),避免每次上传重复创建。 func GetS3Client() (*s3.Client, error) { s3ClientOnce.Do(func() { if conf.Upload.ImageEndpoint == "" { s3ClientErr = errors.New("S3 endpoint not configured") return } s3Client, s3ClientErr = NewS3Client( context.Background(), conf.Upload.ImageEndpoint, conf.Upload.ImageBucket, conf.Upload.ImageAccessID, conf.Upload.ImageAccessSecret, ) }) return s3Client, s3ClientErr } // GetOSSBucket 返回共享的 OSS Bucket(单例)。 func GetOSSBucket() (*oss.Bucket, error) { ossClientOnce.Do(func() { if conf.Upload.AliyunEndpoint == "" { ossClientErr = errors.New("OSS endpoint not configured") return } client, err := oss.New(conf.Upload.AliyunEndpoint, conf.Upload.AliyunAccessID, conf.Upload.AliyunAccessSecret) if err != nil { ossClientErr = errors.Wrap(err, "new OSS client") return } bucket, err := client.Bucket(conf.Upload.AliyunBucket) if err != nil { ossClientErr = errors.Wrap(err, "get OSS bucket") return } ossBucket = bucket }) return ossBucket, ossClientErr }