Documentation
¶
Index ¶
- Variables
- func Delete(path string) error
- func Exists(path string) bool
- func Get(path string) ([]byte, error)
- func GetURL(path string) string
- func Init(cfg *config.StorageConfig) error
- func SetDefaultStorageManager(m *StorageManager)
- func SetStorage(s Storage)
- func Upload(file *multipart.FileHeader, subdir string) (string, error)
- func UploadFromBytes(data []byte, filename, subdir string) (string, error)
- type LocalStorage
- func (s *LocalStorage) Delete(p string) error
- func (s *LocalStorage) Exists(p string) bool
- func (s *LocalStorage) Get(p string) ([]byte, error)
- func (s *LocalStorage) GetURL(path string) string
- func (s *LocalStorage) Upload(file *multipart.FileHeader, subdir string) (string, error)
- func (s *LocalStorage) UploadFromBytes(data []byte, filename, subdir string) (string, error)
- type OSSStorage
- func (s *OSSStorage) Delete(p string) error
- func (s *OSSStorage) Exists(p string) bool
- func (s *OSSStorage) Get(p string) ([]byte, error)
- func (s *OSSStorage) GetSignedURL(path string, expire time.Duration) (string, error)
- func (s *OSSStorage) GetURL(path string) string
- func (s *OSSStorage) Upload(file *multipart.FileHeader, subdir string) (string, error)
- func (s *OSSStorage) UploadFromBytes(data []byte, filename, subdir string) (string, error)
- type Storage
- type StorageManager
Constants ¶
This section is empty.
Variables ¶
var ( // ErrStorageNotInitialized storage 未初始化。 ErrStorageNotInitialized = errors.New("storage not initialized") // ErrPathTraversal 路径穿越被拒绝(C4a)。Delete/Get/Exists/Upload 的相对路径 // 含 `..` 或绝对路径、逃逸根目录时返回。 ErrPathTraversal = errors.New("path traversal detected") // ErrInvalidPath 路径非法(空、含 NUL 等)。 ErrInvalidPath = errors.New("invalid path") // ErrUploadTooLarge 上传实际字节数超过 MaxSizeBytes(P0)。客户端声明的 file.Size // 不可信,故除前置校验外,拷贝阶段按实际字节封顶,防止声明小体积却流式发送大 body 撑爆磁盘/OSS。 ErrUploadTooLarge = errors.New("upload exceeds max size") )
var DefaultStorage atomic.Pointer[StorageManager]
DefaultStorage 默认存储管理器,包级 facade 代理到它。
主线A 修复:改用 atomic.Pointer 保护读写,消除原裸指针置换(SetDefaultStorageManager) 与 facade 无锁读之间的数据竞争,与 config.defaultManager / database.DefaultRedis 对齐。 类型由 *StorageManager 变更为 atomic.Pointer[StorageManager](breaking:下游若直接 调用 DefaultStorage.Init 等方法需改用 Init 等 facade,或 DefaultStorage.Load().Init)。
Functions ¶
func SetDefaultStorageManager ¶ added in v1.1.0
func SetDefaultStorageManager(m *StorageManager)
SetDefaultStorageManager 提升指定 StorageManager 为全局默认。并发安全(atomic.Store)。
Types ¶
type LocalStorage ¶
type LocalStorage struct {
// contains filtered or unexported fields
}
LocalStorage 本地存储
func NewLocalStorage ¶
func NewLocalStorage(cfg *config.LocalStorageConfig) *LocalStorage
NewLocalStorage 创建本地存储实例
安全约束:Path 指向的根目录应为框架独占目录,不与用户可控内容混用。 safeJoin 已防 `..` 路径穿越,但若根目录内已存在指向外部的符号链接, Get 会跟随 symlink 读到根外内容——需保证攻击者无法在根目录内创建 symlink。
func (*LocalStorage) Get ¶
func (s *LocalStorage) Get(p string) ([]byte, error)
Get 获取文件内容。读取受 maxReadBytes 封顶,防止全量读入内存 OOM(C4c)。
func (*LocalStorage) Upload ¶
func (s *LocalStorage) Upload(file *multipart.FileHeader, subdir string) (string, error)
Upload 上传文件
func (*LocalStorage) UploadFromBytes ¶
func (s *LocalStorage) UploadFromBytes(data []byte, filename, subdir string) (string, error)
UploadFromBytes 从字节数组上传文件
type OSSStorage ¶
type OSSStorage struct {
// contains filtered or unexported fields
}
OSSStorage OSS 存储
func NewOSSStorage ¶
func NewOSSStorage(cfg *config.OSSStorageConfig) (*OSSStorage, error)
NewOSSStorage 创建 OSS 存储实例
func (*OSSStorage) Get ¶
func (s *OSSStorage) Get(p string) ([]byte, error)
Get 获取 OSS 文件内容。读取受 maxReadBytes 封顶,防止 OOM(C4c)。
func (*OSSStorage) GetSignedURL ¶
GetSignedURL 获取带签名的临时访问 URL(用于私有文件)
func (*OSSStorage) Upload ¶
func (s *OSSStorage) Upload(file *multipart.FileHeader, subdir string) (string, error)
Upload 上传文件到 OSS
func (*OSSStorage) UploadFromBytes ¶
func (s *OSSStorage) UploadFromBytes(data []byte, filename, subdir string) (string, error)
UploadFromBytes 从字节数组上传文件到 OSS
type Storage ¶
type Storage interface {
Upload(file *multipart.FileHeader, subdir string) (string, error)
UploadFromBytes(data []byte, filename, subdir string) (string, error)
GetURL(path string) string
Delete(path string) error
Get(path string) ([]byte, error)
Exists(path string) bool
}
Storage 存储接口
type StorageManager ¶ added in v1.1.0
type StorageManager struct {
// contains filtered or unexported fields
}
StorageManager 存储管理器(#10)。照 database.Manager 模式: 实例化 + DefaultStorage 全局默认 + 包级 facade 代理,支持多实例与测试注入。
func NewStorageManager ¶ added in v1.1.0
func NewStorageManager() *StorageManager
NewStorageManager 创建存储管理器实例。
func (*StorageManager) Init ¶ added in v1.1.0
func (m *StorageManager) Init(cfg *config.StorageConfig) error
Init 初始化存储
func (*StorageManager) Set ¶ added in v1.1.0
func (m *StorageManager) Set(s Storage)
Set 设置存储实例(用于注入 mock 或自定义实现)。