filesystem

package
v1.4.3 Latest Latest
Warning

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

Go to latest
Published: Jun 12, 2024 License: MIT Imports: 47 Imported by: 0

Documentation

Index

Constants

View Source
const (
	UploadSessionMetaKey     = "upload_session"
	UploadSessionCtx         = "uploadSession"
	UserCtx                  = "user"
	UploadSessionCachePrefix = "callback_"
)

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)
	ErrFileUploadSessionExisted = 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, newFile fsctx.FileHeader) error

GenericAfterUpdate 文件内容更新后

func GenericAfterUpload

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

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

func GenericAfterUploadV1

func GenericAfterUploadV1(ctx context.Context, fs *FileSystem, fileHeader fsctx.FileHeader) error

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

func HookCancelContext

func HookCancelContext(ctx context.Context, fs *FileSystem, file fsctx.FileHeader) error

HookCancelContext 取消上下文

func HookChunkUploadFailed

func HookChunkUploadFailed(ctx context.Context, fs *FileSystem, fileHeader fsctx.FileHeader) error

HookChunkUploadFailed 单个分片上传失败后

func HookChunkUploaded

func HookChunkUploaded(ctx context.Context, fs *FileSystem, fileHeader fsctx.FileHeader) error

HookChunkUploadFinished 单个分片上传结束后

func HookCleanFileContent

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

HookCleanFileContent 清空文件内容

func HookClearFileHeaderSize

func HookClearFileHeaderSize(ctx context.Context, fs *FileSystem, fileHeader fsctx.FileHeader) error

HookClearFileHeaderSize 将FileHeader大小设定为0

func HookClearFileSize

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

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

func HookDeleteTempFile

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

HookDeleteTempFile 删除已保存的临时文件

func HookGenerateThumb

func HookGenerateThumb(ctx context.Context, fs *FileSystem, fileHeader fsctx.FileHeader) error

HookGenerateThumb 生成缩略图

func HookResetPolicy

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

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

func HookUpdateSourceName

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

HookUpdateSourceName 更新文件SourceName

func HookValidateCapacity

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

HookValidateCapacity 验证用户容量

func HookValidateCapacityDiff

func HookValidateCapacityDiff(ctx context.Context, fs *FileSystem, newFile fsctx.FileHeader) error

HookValidateCapacityDiff 根据原有文件和新文件的大小验证用户容量

func HookValidateFile

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

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

func IsInExtensionList

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

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

Types

type FileSystem

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

	/*
	   钩子函数
	*/
	VisitUser *model.User
	Hooks     map[string][]Hook

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

	// 传入的参数
	CreateSession ecm.CreateUploadSessionService

	GinCtx *gin.Context
	// contains filtered or unexported fields
}

FileSystem 管理文件的文件系统

func GetEmptyFS

func GetEmptyFS(cuss ecm.CreateUploadSessionService, c *gin.Context) (*FileSystem, error)

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, file fsctx.FileHeader) (*model.File, error)

AddFile 新增文件记录

func (*FileSystem) AddFileV1

func (fs *FileSystem) AddFileV1(ctx context.Context, file fsctx.FileHeader) error

AddFileV1 新增文件记录

func (*FileSystem) CancelUpload

func (fs *FileSystem) CancelUpload(ctx context.Context, path string, file fsctx.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, writer io.Writer, folderIDs, fileIDs []uint, isArchive bool) 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) CreateUploadSession

func (fs *FileSystem) CreateUploadSession(ctx context.Context, file *fsctx.FileStream) (*serializer.UploadCredential, error)

CreateUploadSession 创建上传会话

func (*FileSystem) Decompress

func (fs *FileSystem) Decompress(ctx context.Context, src, dst, encoding 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 根据存储策略分配文件适配器

func (*FileSystem) GenerateSavePath

func (fs *FileSystem) GenerateSavePath(ctx context.Context, file fsctx.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) 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) ([]serializer.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) ([]serializer.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{}) ([]serializer.Object, error)

Search 搜索文件

func (*FileSystem) SetPolicyFromPreference

func (fs *FileSystem) SetPolicyFromPreference(path, storageType string) error

SetPolicyFromPreference 尝试设定偏好存储策略

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

func (fs *FileSystem) SignURL(ctx context.Context, file *model.File, ttl int64, isDownload bool) (string, error)

SignURL 签名文件原始 URL

func (*FileSystem) SwitchToShadowHandler

func (fs *FileSystem) SwitchToShadowHandler(master cluster.Node, masterURL, masterID string)

SwitchToShadowHandler 将负责上传的 Handler 切换为从机节点转存使用的影子处理器

func (*FileSystem) SwitchToSlaveHandler

func (fs *FileSystem) SwitchToSlaveHandler(node cluster.Node)

SwitchToSlaveHandler 将负责上传的 Handler 切换为从机节点

func (*FileSystem) Trigger

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

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

func (*FileSystem) Upload

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

Upload 上传文件

func (*FileSystem) UploadFromPath

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

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

func (*FileSystem) UploadFromStream

func (fs *FileSystem) UploadFromStream(ctx context.Context, file *fsctx.FileStream, resetPolicy bool) 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 Hook

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

Hook 钩子函数

func HookDeleteUploadSession

func HookDeleteUploadSession(id string) Hook

HookChunkUploadFinished 分片上传结束后处理文件

func HookPopPlaceholderToFile

func HookPopPlaceholderToFile(picInfo string) Hook

HookPopPlaceholderToFile 将占位文件提升为正式文件

func HookTruncateFileTo

func HookTruncateFileTo(size uint64) Hook

HookTruncateFileTo 将物理文件截断至 size

func SlaveAfterUpload

func SlaveAfterUpload(session *serializer.UploadSession) Hook

SlaveAfterUpload Slave模式下上传完成钩子

type Pool

type Pool struct {
	// contains filtered or unexported fields
}

Pool 带有最大配额的任务池

Jump to

Keyboard shortcuts

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