63 lines
1.5 KiB
Go
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
|
|
}
|