diff --git a/go.mod b/go.mod index 932fcb3..ff2bcf0 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module git.beifan.cn/trace-system/backend-go go 1.25.0 require ( + github.com/aliyun/alibabacloud-oss-go-sdk-v2 v1.5.1 github.com/gin-contrib/cors v1.7.6 github.com/gin-gonic/gin v1.11.0 github.com/golang-jwt/jwt/v5 v5.3.1 @@ -46,7 +47,6 @@ require ( require ( github.com/KyleBanks/depth v1.2.1 // indirect - github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible // indirect github.com/bytedance/gopkg v0.1.3 // indirect github.com/bytedance/sonic v1.15.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect diff --git a/go.sum b/go.sum index a99362d..40703b3 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= -github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g= -github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/aliyun/alibabacloud-oss-go-sdk-v2 v1.5.1 h1:vtiFd0hhPAbyYJjztl0wYUq/PqEGkIlDmVuTIy6zw8Y= +github.com/aliyun/alibabacloud-oss-go-sdk-v2 v1.5.1/go.mod h1:FTzydeQVmR24FI0D6XWUOMKckjXehM/jgMn1xC+DA9M= github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE= diff --git a/services/oss_service.go b/services/oss_service.go index 1d42298..57d4d1d 100644 --- a/services/oss_service.go +++ b/services/oss_service.go @@ -1,12 +1,15 @@ package services import ( + "context" "fmt" "io" "net/url" "strings" + "time" - "github.com/aliyun/aliyun-oss-go-sdk/oss" + "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" + "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" "git.beifan.cn/trace-system/backend-go/config" ) @@ -25,21 +28,16 @@ func (s OSSService) UploadObject(objectKey string, reader io.Reader, contentType return err } - client, err := oss.New(normalizeOSSEndpoint(s.cfg.Endpoint), s.cfg.AccessKeyID, s.cfg.AccessKeySecret) - if err != nil { - return fmt.Errorf("初始化 OSS 客户端失败: %w", err) + request := &oss.PutObjectRequest{ + Bucket: oss.Ptr(s.cfg.Bucket), + Key: oss.Ptr(objectKey), + Body: reader, } - - bucket, err := client.Bucket(s.cfg.Bucket) - if err != nil { - return fmt.Errorf("打开 OSS Bucket 失败: %w", err) - } - - options := []oss.Option{} if contentType != "" { - options = append(options, oss.ContentType(contentType)) + request.ContentType = oss.Ptr(contentType) } - if err := bucket.PutObject(objectKey, reader, options...); err != nil { + + if _, err := s.newClient().PutObject(context.TODO(), request); err != nil { return fmt.Errorf("上传现场图片失败: %w", err) } @@ -87,19 +85,22 @@ func (s OSSService) SignedURL(objectKey string) (string, error) { if err := s.validateConfig(); err != nil { return "", err } - client, err := oss.New(normalizeOSSEndpoint(s.cfg.Endpoint), s.cfg.AccessKeyID, s.cfg.AccessKeySecret) - if err != nil { - return "", fmt.Errorf("初始化 OSS 客户端失败: %w", err) - } - bucket, err := client.Bucket(s.cfg.Bucket) - if err != nil { - return "", fmt.Errorf("打开 OSS Bucket 失败: %w", err) - } expires := s.cfg.SignedURLExpire if expires <= 0 { expires = 3600 } - return bucket.SignURL(objectKey, oss.HTTPGet, int64(expires)) + result, err := s.newClient().Presign( + context.TODO(), + &oss.GetObjectRequest{ + Bucket: oss.Ptr(s.cfg.Bucket), + Key: oss.Ptr(objectKey), + }, + oss.PresignExpires(time.Duration(expires)*time.Second), + ) + if err != nil { + return "", fmt.Errorf("生成 OSS 签名 URL 失败: %w", err) + } + return result.URL, nil } func (s OSSService) objectKeyFromRef(objectRef string) string { @@ -138,3 +139,22 @@ func normalizeOSSEndpoint(endpoint string) string { } return "https://" + endpoint } + +func (s OSSService) newClient() *oss.Client { + cfg := oss.LoadDefaultConfig(). + WithCredentialsProvider(credentials.NewStaticCredentialsProvider( + s.cfg.AccessKeyID, + s.cfg.AccessKeySecret, + )). + WithRegion(normalizeOSSRegion(s.cfg.Region)). + WithEndpoint(strings.TrimPrefix(strings.TrimPrefix(normalizeOSSEndpoint(s.cfg.Endpoint), "https://"), "http://")) + return oss.NewClient(cfg) +} + +func normalizeOSSRegion(region string) string { + region = strings.TrimSpace(region) + if strings.HasPrefix(region, "oss-") { + return strings.TrimPrefix(region, "oss-") + } + return region +}