Add internal/storage/storage.go

This commit is contained in:
ata
2026-07-10 10:06:48 +00:00
committed by Gitee
parent ca66c5ae4e
commit f28060b454

View File

@@ -0,0 +1,53 @@
package storage
import (
"io"
"log"
"gotest/internal/config"
)
// Storage 文件存储抽象接口,统一本地存储、MinIO、腾讯云 COS 的操作
type Storage interface {
// Upload 上传文件,key 为存储路径,返回可访问的 URL
Upload(key string, reader io.Reader, contentType string) (string, error)
// Delete 删除指定 key 的文件
Delete(key string) error
// GetURL 获取指定 key 的访问 URL
GetURL(key string) string
}
// NewStorage 根据配置创建存储实例
// 根据 cfg.Type 返回 local/minio/cos 实现,默认 local
// 当 minio/cos 关键配置缺失或初始化失败时,降级为本地存储并打印提示日志
func NewStorage(cfg *config.StorageConfig) Storage {
switch cfg.Type {
case "minio":
// 关键配置(endpoint/accesskey/secretkey)缺失时降级为本地存储
if cfg.MinIO.Endpoint == "" || cfg.MinIO.AccessKey == "" || cfg.MinIO.SecretKey == "" {
log.Println("MinIO 关键配置(endpoint/accesskey/secretkey)缺失,降级使用本地存储")
return NewLocalStorage(&cfg.Local)
}
s, err := NewMinIOStorage(&cfg.MinIO)
if err != nil {
log.Printf("MinIO 存储初始化失败: %v,降级使用本地存储\n", err)
return NewLocalStorage(&cfg.Local)
}
return s
case "cos":
// 关键配置(secretid/secretkey)缺失时降级为本地存储
if cfg.COS.SecretID == "" || cfg.COS.SecretKey == "" {
log.Println("COS 关键配置(secretid/secretkey)缺失,降级使用本地存储")
return NewLocalStorage(&cfg.Local)
}
s, err := NewCOSStorage(&cfg.COS)
if err != nil {
log.Printf("COS 存储初始化失败: %v,降级使用本地存储\n", err)
return NewLocalStorage(&cfg.Local)
}
return s
default:
// 默认使用本地存储
return NewLocalStorage(&cfg.Local)
}
}