Add internal/storage/cos.go
This commit is contained in:
72
internal/storage/cos.go
Normal file
72
internal/storage/cos.go
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/tencentyun/cos-go-sdk-v5"
|
||||||
|
"gotest/internal/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
// COSStorage 腾讯云 COS 对象存储实现
|
||||||
|
type COSStorage struct {
|
||||||
|
client *cos.Client
|
||||||
|
baseURL string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCOSStorage 创建 COS 存储实例
|
||||||
|
func NewCOSStorage(cfg *config.COSConfig) (*COSStorage, error) {
|
||||||
|
// 拼接 bucket 访问地址: https://<bucket>.cos.<region>.myqcloud.com
|
||||||
|
bucketURL := fmt.Sprintf("https://%s.cos.%s.myqcloud.com", cfg.Bucket, cfg.Region)
|
||||||
|
u, err := url.Parse(bucketURL)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("解析 COS bucket 地址失败: %w", err)
|
||||||
|
}
|
||||||
|
baseURL := &cos.BaseURL{BucketURL: u}
|
||||||
|
client := cos.NewClient(baseURL, &http.Client{
|
||||||
|
Transport: &cos.AuthorizationTransport{
|
||||||
|
SecretID: cfg.SecretID,
|
||||||
|
SecretKey: cfg.SecretKey,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
return &COSStorage{
|
||||||
|
client: client,
|
||||||
|
baseURL: cfg.BaseURL,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Upload 上传文件到 COS
|
||||||
|
func (s *COSStorage) Upload(key string, reader io.Reader, contentType string) (string, error) {
|
||||||
|
ctx := context.Background()
|
||||||
|
opt := &cos.ObjectPutOptions{
|
||||||
|
ObjectPutHeaderOptions: &cos.ObjectPutHeaderOptions{
|
||||||
|
ContentType: contentType,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
_, err := s.client.Object.Put(ctx, key, reader, opt)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("上传文件到 COS 失败: %w", err)
|
||||||
|
}
|
||||||
|
return s.GetURL(key), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete 删除 COS 中的文件
|
||||||
|
func (s *COSStorage) Delete(key string) error {
|
||||||
|
ctx := context.Background()
|
||||||
|
_, err := s.client.Object.Delete(ctx, key, nil)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetURL 获取 COS 文件访问 URL
|
||||||
|
// 优先使用 BaseURL 拼接,为空时回退到 bucket 地址
|
||||||
|
func (s *COSStorage) GetURL(key string) string {
|
||||||
|
base := strings.TrimRight(s.baseURL, "/")
|
||||||
|
if base == "" {
|
||||||
|
base = strings.TrimRight(s.client.BaseURL.BucketURL.String(), "/")
|
||||||
|
}
|
||||||
|
return base + "/" + key
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user