156 lines
4.7 KiB
Go
156 lines
4.7 KiB
Go
package storage
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"io"
|
||
"strings"
|
||
|
||
"git.toowon.com/jimmy/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")
|
||
}
|