Files
tamabox/internal/storage/client.go
T

63 lines
1.5 KiB
Go

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
}