filesystem

package
v0.0.0-...-746aa3e Latest Latest
Warning

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

Go to latest
Published: Oct 26, 2020 License: GPL-3.0 Imports: 40 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrUnknownPolicyType       = errors.New("未知存储策略类型")
	ErrFileSizeTooBig          = errors.New("单个文件尺寸太大")
	ErrFileExtensionNotAllowed = errors.New("不允许上传此类型的文件")
	ErrInsufficientCapacity    = errors.New("容量空间不足")
	ErrIllegalObjectName       = errors.New("目标名称非法")
	ErrClientCanceled          = errors.New("客户端取消操作")
	ErrRootProtected           = errors.New("无法对根目录进行操作")
	ErrInsertFileRecord        = serializer.NewError(serializer.CodeDBError, "无法插入文件记录", nil)
	ErrFileExisted             = serializer.NewError(serializer.CodeObjectExist, "同名文件或目录已存在", nil)
	ErrFolderExisted           = serializer.NewError(serializer.CodeObjectExist, "同名目录已存在", nil)
	ErrPathNotExist            = serializer.NewError(404, "路径不存在", nil)
	ErrObjectNotExist          = serializer.NewError(404, "文件不存在", nil)
	ErrIO                      = serializer.NewError(serializer.CodeIOFailed, "无法读取文件数据", nil)
	ErrDBListObjects           = serializer.NewError(serializer.CodeDBError, "无法列取对象记录", nil)
	ErrDBDeleteObjects         = serializer.NewError(serializer.CodeDBError, "无法删除对象记录", nil)
)
View Source
var FSPool = sync.Pool{
	New: func() interface{} {
		return &FileSystem{}
	},
}

FSPool 文件系统资源池

View Source
var HandledExtension = []string{"jpg", "jpeg", "png", "gif"}

HandledExtension 可以生成缩略图的文件扩展名

Functions

func GenericAfterUpdate

func GenericAfterUpdate(ctx context.Context, fs *FileSystem) error

GenericAfterUpdate 文件内容更新后

func GenericAfterUpload

func GenericAfterUpload(ctx context.Context, fs *FileSystem) error

GenericAfterUpload 文件上传完成后,包含数据库操作

func HookChangeCapacity

func HookChangeCapacity(ctx context.Context, fs *FileSystem) error

HookChangeCapacity 根据原有文件和新文件的大小更新用户容量

func HookCleanFileContent

func HookCleanFileContent(ctx context.Context, fs *FileSystem) error

HookCleanFileContent 清空文件内容

func HookClearFileSize

func HookClearFileSize(ctx context.Context, fs *FileSystem) error

HookClearFileSize 将原始文件的尺寸设为0

func HookDeleteTempFile

func HookDeleteTempFile(ctx context.Context, fs *FileSystem) error

HookDeleteTempFile 删除已保存的临时文件

func HookGiveBackCapacity

func HookGiveBackCapacity(ctx context.Context, fs *FileSystem) error

HookGiveBackCapacity 归还用户容量

func HookIsFileExist

func HookIsFileExist(ctx context.Context, fs *FileSystem) error

HookIsFileExist 检查虚拟路径文件是否存在

func HookResetPolicy

func HookResetPolicy(ctx context.Context, fs *FileSystem) error

HookResetPolicy 重设存储策略为上下文已有文件

func HookSlaveUploadValidate

func HookSlaveUploadValidate(ctx context.Context, fs *FileSystem) error

HookSlaveUploadValidate Slave模式下对文件上传的一系列验证

func HookUpdateSourceName

func HookUpdateSourceName(ctx context.Context, fs *FileSystem) error

HookUpdateSourceName 更新文件SourceName TODO:测试

func HookValidateCapacity

func HookValidateCapacity(ctx context.Context, fs *FileSystem) error

HookValidateCapacity 验证并扣除用户容量,包含数据库操作

func HookValidateCapacityWithoutIncrease

func HookValidateCapacityWithoutIncrease(ctx context.Context, fs *FileSystem) error

HookValidateCapacityWithoutIncrease 验证用户容量,不扣除

func HookValidateFile

func HookValidateFile(ctx context.Context, fs *FileSystem) error

HookValidateFile 一系列对文件检验的集合

func IsInExtensionList

func IsInExtensionList(extList []string, fileName string) bool

IsInExtensionList 返回文件的扩展名是否在给定的列表范围内

func SlaveAfterUpload

func SlaveAfterUpload(ctx context.Context, fs *FileSystem) error

SlaveAfterUpload Slave模式下上传完成钩子

Types

type FileHeader

type FileHeader interface {
	io.Reader
	io.Closer
	GetSize() uint64
	GetMIMEType() string
	GetFileName() string
	GetVirtualPath() string
}

FileHeader 上传来的文件数据处理器

type FileSystem

type FileSystem struct {
	// 文件系统所有者
	User *model.User
	// 操作文件使用的存储策略
	Policy *model.Policy
	// 当前正在处理的文件对象
	FileTarget []model.File
	// 当前正在处理的目录对象
	DirTarget []model.Folder
	// 相对根目录
	Root *model.Folder
	// 互斥锁
	Lock sync.Mutex

	/*
	   钩子函数
	*/
	Hooks map[string][]Hook

	/*
	   文件系统处理适配器
	*/
	Handler Handler
}

FileSystem 管理文件的文件系统

func NewAnonymousFileSystem

func NewAnonymousFileSystem() (*FileSystem, error)

NewAnonymousFileSystem 初始化匿名文件系统

func NewFileSystem

func NewFileSystem(user *model.User) (*FileSystem, error)

NewFileSystem 初始化一个文件系统

func NewFileSystemFromCallback

func NewFileSystemFromCallback(c *gin.Context) (*FileSystem, error)

NewFileSystemFromCallback 从gin.Context创建回调用文件系统

func NewFileSystemFromContext

func NewFileSystemFromContext(c *gin.Context) (*FileSystem, error)

NewFileSystemFromContext 从gin.Context创建文件系统

func (*FileSystem) AddFile

func (fs *FileSystem) AddFile(ctx context.Context, parent *model.Folder) (*model.File, error)

AddFile 新增文件记录

func (*FileSystem) CancelUpload

func (fs *FileSystem) CancelUpload(ctx context.Context, path string, file FileHeader)

CancelUpload 监测客户端取消上传

func (*FileSystem) CleanHooks

func (fs *FileSystem) CleanHooks(name string)

CleanHooks 清空钩子,name为空表示全部清空

func (*FileSystem) CleanTargets

func (fs *FileSystem) CleanTargets()

CleanTargets 清空目标

func (*FileSystem) Compress

func (fs *FileSystem) Compress(ctx context.Context, folderIDs, fileIDs []uint, isArchive bool) (string, error)

Compress 创建给定目录和文件的压缩文件

func (*FileSystem) Copy

func (fs *FileSystem) Copy(ctx context.Context, dirs, files []uint, src, dst string) error

Copy 复制src目录下的文件或目录到dst, 暂时只支持单文件

func (*FileSystem) CreateDirectory

func (fs *FileSystem) CreateDirectory(ctx context.Context, fullPath string) (*model.Folder, error)

CreateDirectory 根据给定的完整创建目录,支持递归创建

func (*FileSystem) Decompress

func (fs *FileSystem) Decompress(ctx context.Context, src, dst string) error

Decompress 解压缩给定压缩文件到dst目录

func (*FileSystem) Delete

func (fs *FileSystem) Delete(ctx context.Context, dirs, files []uint, force bool) error

Delete 递归删除对象, force 为 true 时强制删除文件记录,忽略物理删除是否成功

func (*FileSystem) DispatchHandler

func (fs *FileSystem) DispatchHandler() error

DispatchHandler 根据存储策略分配文件适配器 TODO 完善测试

func (*FileSystem) GenerateSavePath

func (fs *FileSystem) GenerateSavePath(ctx context.Context, file FileHeader) string

GenerateSavePath 生成要存放文件的路径 TODO 完善测试

func (*FileSystem) GenerateThumbnail

func (fs *FileSystem) GenerateThumbnail(ctx context.Context, file *model.File)

GenerateThumbnail 尝试为本地策略文件生成缩略图并获取图像原始大小 TODO 失败时,如果之前还有图像信息,则清除

func (*FileSystem) GenerateThumbnailSize

func (fs *FileSystem) GenerateThumbnailSize(w, h int) (uint, uint)

GenerateThumbnailSize 获取要生成的缩略图的尺寸

func (*FileSystem) GetContent

func (fs *FileSystem) GetContent(ctx context.Context, id uint) (response.RSCloser, error)

GetContent 获取文件内容,path为虚拟路径

func (*FileSystem) GetDownloadContent

func (fs *FileSystem) GetDownloadContent(ctx context.Context, id uint) (response.RSCloser, error)

GetDownloadContent 获取用于下载的文件流

func (*FileSystem) GetDownloadURL

func (fs *FileSystem) GetDownloadURL(ctx context.Context, id uint, timeout string) (string, error)

GetDownloadURL 创建文件下载链接, timeout 为数据库中存储过期时间的字段

func (*FileSystem) GetPhysicalFileContent

func (fs *FileSystem) GetPhysicalFileContent(ctx context.Context, path string) (response.RSCloser, error)

GetPhysicalFileContent 根据文件物理路径获取文件流

func (*FileSystem) GetSource

func (fs *FileSystem) GetSource(ctx context.Context, fileID uint) (string, error)

GetSource 获取可直接访问文件的外链地址

func (*FileSystem) GetThumb

func (fs *FileSystem) GetThumb(ctx context.Context, id uint) (*response.ContentResponse, error)

GetThumb 获取文件的缩略图

func (*FileSystem) GetUploadToken

func (fs *FileSystem) GetUploadToken(ctx context.Context, path string, size uint64, name string) (*serializer.UploadCredential, error)

GetUploadToken 生成新的上传凭证

func (*FileSystem) GroupFileByPolicy

func (fs *FileSystem) GroupFileByPolicy(ctx context.Context, files []model.File) map[uint][]*model.File

GroupFileByPolicy 将目标文件按照存储策略分组

func (*FileSystem) IsChildFileExist

func (fs *FileSystem) IsChildFileExist(folder *model.Folder, name string) (bool, *model.File)

IsChildFileExist 确定folder目录下是否有名为name的文件

func (*FileSystem) IsFileExist

func (fs *FileSystem) IsFileExist(fullPath string) (bool, *model.File)

IsFileExist 返回给定路径的文件是否存在

func (*FileSystem) IsPathExist

func (fs *FileSystem) IsPathExist(path string) (bool, *model.Folder)

IsPathExist 返回给定目录是否存在 如果存在就返回目录

func (*FileSystem) List

func (fs *FileSystem) List(ctx context.Context, dirPath string, pathProcessor func(string) string) ([]Object, error)

List 列出路径下的内容, pathProcessor为最终对象路径的处理钩子。 有些情况下(如在分享页面列对象)时, 路径需要截取掉被分享目录路径之前的部分。

func (*FileSystem) ListDeleteDirs

func (fs *FileSystem) ListDeleteDirs(ctx context.Context, ids []uint) error

ListDeleteDirs 递归列出要删除目录,及目录下所有文件

func (*FileSystem) ListDeleteFiles

func (fs *FileSystem) ListDeleteFiles(ctx context.Context, ids []uint) error

ListDeleteFiles 根据给定的路径列出要删除的文件

func (*FileSystem) ListPhysical

func (fs *FileSystem) ListPhysical(ctx context.Context, dirPath string) ([]Object, error)

ListPhysical 列出存储策略中的外部目录 TODO:测试

func (*FileSystem) Move

func (fs *FileSystem) Move(ctx context.Context, dirs, files []uint, src, dst string) error

Move 移动文件和目录, 将id列表dirs和files从src移动至dst

func (*FileSystem) Preview

func (fs *FileSystem) Preview(ctx context.Context, id uint, isText bool) (*response.ContentResponse, error)

Preview 预览文件

path   -   文件虚拟路径
isText -   是否为文本文件,文本文件会忽略重定向,直接由
           服务端拉取中转给用户,故会对文件大小进行限制

func (*FileSystem) Recycle

func (fs *FileSystem) Recycle()

Recycle 回收FileSystem资源

func (*FileSystem) Rename

func (fs *FileSystem) Rename(ctx context.Context, dir, file []uint, new string) (err error)

Rename 重命名对象

func (*FileSystem) ResetFileIfNotExist

func (fs *FileSystem) ResetFileIfNotExist(ctx context.Context, path string) error

ResetFileIfNotExist 重设当前目标文件为 path,如果当前目标为空

func (*FileSystem) SaveTo

func (fs *FileSystem) SaveTo(ctx context.Context, path string) error

SaveTo 将别人分享的文件转存到目标路径下

func (*FileSystem) Search

func (fs *FileSystem) Search(ctx context.Context, keywords ...interface{}) ([]Object, error)

Search 搜索文件

func (*FileSystem) SetTargetByInterface

func (fs *FileSystem) SetTargetByInterface(target interface{}) error

SetTargetByInterface 根据 model.File 或者 model.Folder 设置目标对象 TODO 测试

func (*FileSystem) SetTargetDir

func (fs *FileSystem) SetTargetDir(dirs *[]model.Folder)

SetTargetDir 设置当前处理的目标目录

func (*FileSystem) SetTargetFile

func (fs *FileSystem) SetTargetFile(files *[]model.File)

SetTargetFile 设置当前处理的目标文件

func (*FileSystem) SetTargetFileByIDs

func (fs *FileSystem) SetTargetFileByIDs(ids []uint) error

SetTargetFileByIDs 根据文件ID设置目标文件,忽略用户ID

func (*FileSystem) Trigger

func (fs *FileSystem) Trigger(ctx context.Context, name string) error

Trigger 触发钩子,遇到第一个错误时 返回错误,后续钩子不会继续执行

func (*FileSystem) Upload

func (fs *FileSystem) Upload(ctx context.Context, file FileHeader) (err error)

Upload 上传文件

func (*FileSystem) UploadFromPath

func (fs *FileSystem) UploadFromPath(ctx context.Context, src, dst string) error

UploadFromPath 将本机已有文件上传到用户的文件系统

func (*FileSystem) UploadFromStream

func (fs *FileSystem) UploadFromStream(ctx context.Context, src io.ReadCloser, dst string, size uint64) error

UploadFromStream 从文件流上传文件

func (*FileSystem) Use

func (fs *FileSystem) Use(name string, hook Hook)

Use 注入钩子

func (*FileSystem) ValidateCapacity

func (fs *FileSystem) ValidateCapacity(ctx context.Context, size uint64) bool

ValidateCapacity 验证并扣除用户容量

func (*FileSystem) ValidateExtension

func (fs *FileSystem) ValidateExtension(ctx context.Context, fileName string) bool

ValidateExtension 验证文件扩展名

func (*FileSystem) ValidateFileSize

func (fs *FileSystem) ValidateFileSize(ctx context.Context, size uint64) bool

ValidateFileSize 验证上传的文件大小是否超出限制

func (*FileSystem) ValidateLegalName

func (fs *FileSystem) ValidateLegalName(ctx context.Context, name string) bool

ValidateLegalName 验证文件名/文件夹名是否合法

type Handler

type Handler interface {
	// 上传文件, dst为文件存储路径,size 为文件大小。上下文关闭
	// 时,应取消上传并清理临时文件
	Put(ctx context.Context, file io.ReadCloser, dst string, size uint64) error

	// 删除一个或多个给定路径的文件,返回删除失败的文件路径列表及错误
	Delete(ctx context.Context, files []string) ([]string, error)

	// 获取文件内容
	Get(ctx context.Context, path string) (response.RSCloser, error)

	// 获取缩略图,可直接在ContentResponse中返回文件数据流,也可指
	// 定为重定向
	Thumb(ctx context.Context, path string) (*response.ContentResponse, error)

	// 获取外链/下载地址,
	// url - 站点本身地址,
	// isDownload - 是否直接下载
	Source(ctx context.Context, path string, url url.URL, ttl int64, isDownload bool, speed int) (string, error)

	// Token 获取有效期为ttl的上传凭证和签名,同时回调会话有效期为sessionTTL
	Token(ctx context.Context, ttl int64, callbackKey string) (serializer.UploadCredential, error)

	// List 递归列取远程端path路径下文件、目录,不包含path本身,
	// 返回的对象路径以path作为起始根目录.
	// recursive - 是否递归列出
	List(ctx context.Context, path string, recursive bool) ([]response.Object, error)
}

Handler 存储策略适配器

type Hook

type Hook func(ctx context.Context, fs *FileSystem) error

Hook 钩子函数

type Object

type Object struct {
	ID   string `json:"id"`
	Name string `json:"name"`
	Path string `json:"path"`
	Pic  string `json:"pic"`
	Size uint64 `json:"size"`
	Type string `json:"type"`
	Date string `json:"date"`
	Key  string `json:"key,omitempty"`
}

Object 文件或者目录

Directories

Path Synopsis
driver
cos
oss
s3

Jump to

Keyboard shortcuts

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