storage

package
v1.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 4, 2026 License: MIT Imports: 18 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
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")
)

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 Delete

func Delete(path string) error

Delete 删除文件

func Exists

func Exists(path string) bool

Exists 检查文件是否存在

func Get

func Get(path string) ([]byte, error)

Get 获取文件内容

func GetURL

func GetURL(path string) string

GetURL 获取文件访问 URL

func Init

func Init(cfg *config.StorageConfig) error

Init 初始化存储

func SetDefaultStorageManager added in v1.1.0

func SetDefaultStorageManager(m *StorageManager)

SetDefaultStorageManager 提升指定 StorageManager 为全局默认。并发安全(atomic.Store)。

func SetStorage

func SetStorage(s Storage)

SetStorage 设置全局存储实例

func Upload

func Upload(file *multipart.FileHeader, subdir string) (string, error)

Upload 上传文件

func UploadFromBytes

func UploadFromBytes(data []byte, filename, subdir string) (string, error)

UploadFromBytes 从字节数组上传文件

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) Delete

func (s *LocalStorage) Delete(p string) error

Delete 删除文件

func (*LocalStorage) Exists

func (s *LocalStorage) Exists(p string) bool

Exists 检查文件是否存在

func (*LocalStorage) Get

func (s *LocalStorage) Get(p string) ([]byte, error)

Get 获取文件内容。读取受 maxReadBytes 封顶,防止全量读入内存 OOM(C4c)。

func (*LocalStorage) GetURL

func (s *LocalStorage) GetURL(path string) string

GetURL 获取文件访问 URL

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) Delete

func (s *OSSStorage) Delete(p string) error

Delete 删除 OSS 文件

func (*OSSStorage) Exists

func (s *OSSStorage) Exists(p string) bool

Exists 检查 OSS 文件是否存在

func (*OSSStorage) Get

func (s *OSSStorage) Get(p string) ([]byte, error)

Get 获取 OSS 文件内容。读取受 maxReadBytes 封顶,防止 OOM(C4c)。

func (*OSSStorage) GetSignedURL

func (s *OSSStorage) GetSignedURL(path string, expire time.Duration) (string, error)

GetSignedURL 获取带签名的临时访问 URL(用于私有文件)

func (*OSSStorage) GetURL

func (s *OSSStorage) GetURL(path string) string

GetURL 获取文件访问 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 存储接口

func GetStorage

func GetStorage() Storage

GetStorage 获取全局存储实例

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) Get added in v1.1.0

func (m *StorageManager) Get() Storage

Get 返回当前存储实例。

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 或自定义实现)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL