37 lines
1.4 KiB
Go
37 lines
1.4 KiB
Go
// Package storage 定义文件存储抽象,屏蔽本地磁盘与对象存储(minIO/OSS 等)的差异。
|
|
// 业务层(service)仅依赖 Storage 接口,便于替换存储后端与单测 mock。
|
|
package storage
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
|
|
"portal-mini-go/internal/pkg/config"
|
|
"portal-mini-go/internal/pkg/storage/local"
|
|
)
|
|
|
|
// Storage 是文件存储抽象。
|
|
// key 的约定形如 "2006/01/02/<rand>.ext",由 service 层生成,按日期分片避免单目录文件过多。
|
|
type Storage interface {
|
|
// Put 写入文件内容;size 为文件字节数(<=0 表示未知,由实现自行处理)。
|
|
Put(ctx context.Context, key string, r io.Reader, size int64) error
|
|
// Get 返回文件读取流,调用方负责关闭;不存在返回 ErrNotFound。
|
|
Get(ctx context.Context, key string) (io.ReadCloser, error)
|
|
// Delete 删除文件;不存在不报错。
|
|
Delete(ctx context.Context, key string) error
|
|
// URL 返回客户端可访问的地址(本地为 baseURL 拼接;对象存储可为签名/公开 URL)。
|
|
URL(key string) string
|
|
}
|
|
|
|
// New 依据配置构造存储实现。
|
|
// 当前支持 local;minio 等对象存储预留(后续在此补充 case 并接入 SDK)。
|
|
func New(cfg config.UploadConfig) (Storage, error) {
|
|
switch cfg.StorageType {
|
|
case "", "local":
|
|
return local.New(cfg.LocalPath, cfg.BaseURL), nil
|
|
default:
|
|
return nil, fmt.Errorf("storage: 不支持的存储类型 %q", cfg.StorageType)
|
|
}
|
|
}
|