Migrate OSS integration to SDK v2

This commit is contained in:
Frudrax Cheng
2026-06-02 17:18:49 +08:00
parent 044337ac03
commit 7bacd925ed
3 changed files with 45 additions and 25 deletions
+1 -1
View File
@@ -3,6 +3,7 @@ module git.beifan.cn/trace-system/backend-go
go 1.25.0 go 1.25.0
require ( require (
github.com/aliyun/alibabacloud-oss-go-sdk-v2 v1.5.1
github.com/gin-contrib/cors v1.7.6 github.com/gin-contrib/cors v1.7.6
github.com/gin-gonic/gin v1.11.0 github.com/gin-gonic/gin v1.11.0
github.com/golang-jwt/jwt/v5 v5.3.1 github.com/golang-jwt/jwt/v5 v5.3.1
@@ -46,7 +47,6 @@ require (
require ( require (
github.com/KyleBanks/depth v1.2.1 // indirect 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/gopkg v0.1.3 // indirect
github.com/bytedance/sonic v1.15.0 // indirect github.com/bytedance/sonic v1.15.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
+2 -2
View File
@@ -1,7 +1,7 @@
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= 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/alibabacloud-oss-go-sdk-v2 v1.5.1 h1:vtiFd0hhPAbyYJjztl0wYUq/PqEGkIlDmVuTIy6zw8Y=
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/go.mod h1:FTzydeQVmR24FI0D6XWUOMKckjXehM/jgMn1xC+DA9M=
github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= 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/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=
github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE= github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE=
+42 -22
View File
@@ -1,12 +1,15 @@
package services package services
import ( import (
"context"
"fmt" "fmt"
"io" "io"
"net/url" "net/url"
"strings" "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" "git.beifan.cn/trace-system/backend-go/config"
) )
@@ -25,21 +28,16 @@ func (s OSSService) UploadObject(objectKey string, reader io.Reader, contentType
return err return err
} }
client, err := oss.New(normalizeOSSEndpoint(s.cfg.Endpoint), s.cfg.AccessKeyID, s.cfg.AccessKeySecret) request := &oss.PutObjectRequest{
if err != nil { Bucket: oss.Ptr(s.cfg.Bucket),
return fmt.Errorf("初始化 OSS 客户端失败: %w", err) 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 != "" { 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) return fmt.Errorf("上传现场图片失败: %w", err)
} }
@@ -87,19 +85,22 @@ func (s OSSService) SignedURL(objectKey string) (string, error) {
if err := s.validateConfig(); err != nil { if err := s.validateConfig(); err != nil {
return "", err 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 expires := s.cfg.SignedURLExpire
if expires <= 0 { if expires <= 0 {
expires = 3600 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 { func (s OSSService) objectKeyFromRef(objectRef string) string {
@@ -138,3 +139,22 @@ func normalizeOSSEndpoint(endpoint string) string {
} }
return "https://" + endpoint 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
}