初始版本,工具基础类

This commit is contained in:
2025-11-30 13:02:34 +08:00
commit ea4e2e305d
37 changed files with 7480 additions and 0 deletions

155
storage/oss.go Normal file
View File

@@ -0,0 +1,155 @@
package storage
import (
"context"
"fmt"
"io"
"strings"
"github.com/go-common/config"
)
// OSSStorage OSS存储实现
type OSSStorage struct {
config *config.OSSConfig
// client 存储OSS客户端实际使用时需要根据具体的OSS SDK实现
// 这里使用interface{},实际使用时需要替换为具体的客户端类型
client interface{}
}
// NewOSSStorage 创建OSS存储实例
func NewOSSStorage(cfg *config.OSSConfig) (*OSSStorage, error) {
if cfg == nil {
return nil, fmt.Errorf("OSS config is nil")
}
storage := &OSSStorage{
config: cfg,
}
// 初始化OSS客户端
// 注意这里需要根据实际的OSS SDK实现
// 例如使用阿里云OSS SDK:
// client, err := oss.New(cfg.Endpoint, cfg.AccessKeyID, cfg.AccessKeySecret)
// if err != nil {
// return nil, fmt.Errorf("failed to create OSS client: %w", err)
// }
// storage.client = client
return storage, nil
}
// Upload 上传文件到OSS
func (s *OSSStorage) Upload(ctx context.Context, objectKey string, reader io.Reader, contentType ...string) error {
// 实现OSS上传逻辑
// 注意这里需要根据实际的OSS SDK实现
// 示例使用阿里云OSS SDK:
// bucket, err := s.client.Bucket(s.config.Bucket)
// if err != nil {
// return fmt.Errorf("failed to get bucket: %w", err)
// }
//
// options := []oss.Option{}
// if len(contentType) > 0 && contentType[0] != "" {
// options = append(options, oss.ContentType(contentType[0]))
// }
//
// err = bucket.PutObject(objectKey, reader, options...)
// if err != nil {
// return fmt.Errorf("failed to upload object: %w", err)
// }
// 当前实现返回错误提示需要实现具体的OSS SDK
return fmt.Errorf("OSS upload not implemented, please implement with actual OSS SDK")
}
// GetURL 获取OSS文件访问URL
func (s *OSSStorage) GetURL(objectKey string, expires int64) (string, error) {
if s.config.Domain != "" {
// 使用自定义域名
if strings.HasSuffix(s.config.Domain, "/") {
return s.config.Domain + objectKey, nil
}
return s.config.Domain + "/" + objectKey, nil
}
// 使用OSS默认域名
protocol := "http"
if s.config.UseSSL {
protocol = "https"
}
// 构建OSS URL
// 格式: https://bucket.endpoint/objectKey
url := fmt.Sprintf("%s://%s.%s/%s", protocol, s.config.Bucket, s.config.Endpoint, objectKey)
// 如果设置了过期时间需要生成签名URL
// 注意这里需要根据实际的OSS SDK实现
// 示例使用阿里云OSS SDK:
// if expires > 0 {
// bucket, err := s.client.Bucket(s.config.Bucket)
// if err != nil {
// return "", err
// }
// signedURL, err := bucket.SignURL(objectKey, oss.HTTPGet, expires)
// if err != nil {
// return "", err
// }
// return signedURL, nil
// }
return url, nil
}
// Delete 删除OSS文件
func (s *OSSStorage) Delete(ctx context.Context, objectKey string) error {
// 实现OSS删除逻辑
// 注意这里需要根据实际的OSS SDK实现
// 示例使用阿里云OSS SDK:
// bucket, err := s.client.Bucket(s.config.Bucket)
// if err != nil {
// return fmt.Errorf("failed to get bucket: %w", err)
// }
// err = bucket.DeleteObject(objectKey)
// if err != nil {
// return fmt.Errorf("failed to delete object: %w", err)
// }
return fmt.Errorf("OSS delete not implemented, please implement with actual OSS SDK")
}
// Exists 检查OSS文件是否存在
func (s *OSSStorage) Exists(ctx context.Context, objectKey string) (bool, error) {
// 实现OSS存在性检查逻辑
// 注意这里需要根据实际的OSS SDK实现
// 示例使用阿里云OSS SDK:
// bucket, err := s.client.Bucket(s.config.Bucket)
// if err != nil {
// return false, fmt.Errorf("failed to get bucket: %w", err)
// }
// exists, err := bucket.IsObjectExist(objectKey)
// if err != nil {
// return false, fmt.Errorf("failed to check object existence: %w", err)
// }
// return exists, nil
return false, fmt.Errorf("OSS exists check not implemented, please implement with actual OSS SDK")
}
// GetObject 获取OSS文件内容
func (s *OSSStorage) GetObject(ctx context.Context, objectKey string) (io.ReadCloser, error) {
// 实现OSS获取对象逻辑
// 注意这里需要根据实际的OSS SDK实现
// 示例使用阿里云OSS SDK:
// bucket, err := s.client.Bucket(s.config.Bucket)
// if err != nil {
// return nil, fmt.Errorf("failed to get bucket: %w", err)
// }
// body, err := bucket.GetObject(objectKey)
// if err != nil {
// return nil, fmt.Errorf("failed to get object: %w", err)
// }
// return body, nil
return nil, fmt.Errorf("OSS get object not implemented, please implement with actual OSS SDK")
}