From 297b507ca7f5d2f3a2ac730efa9afcb2fafbe6bf Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Tue, 10 Dec 2019 20:42:40 +0800 Subject: [PATCH] Feat: get file content via anonymous url --- conf/conf.ini | 22 +++++++++++----------- models/file.go | 11 +++++++++-- models/migration.go | 12 ++++++++++++ pkg/filesystem/file.go | 17 ++++++++++------- pkg/filesystem/filesystem.go | 26 ++++++++++++++++++++++++++ pkg/serializer/error.go | 2 ++ routers/controllers/file.go | 2 +- service/explorer/file.go | 19 +++++++++++++++++++ 8 files changed, 90 insertions(+), 21 deletions(-) diff --git a/conf/conf.ini b/conf/conf.ini index 46d0ccd..f9b0ebb 100644 --- a/conf/conf.ini +++ b/conf/conf.ini @@ -7,18 +7,18 @@ MaxWidth = 400 MaxHeight = 300 FileSuffix = ._thumb -[Database] -Type = mysql -User = root -Password = root -Host = 127.0.0.1:3306 -Name = v3 -TablePrefix = v3_ +; [Database] +; Type = mysql +; User = root +; Password = root +; Host = 127.0.0.1:3306 +; Name = v3 +; TablePrefix = v3_ -[Redis] -Server = 127.0.0.1:6379 -Password = -DB = 0 +; [Redis] +; Server = 127.0.0.1:6379 +; Password = +; DB = 0 [Captcha] Height = 60 diff --git a/models/file.go b/models/file.go index 3904a52..573ff16 100644 --- a/models/file.go +++ b/models/file.go @@ -52,10 +52,17 @@ func (folder *Folder) GetChildFiles() ([]File, error) { return files, result.Error } -// GetFilesByIDs 根据文件ID批量获取文件 +// GetFilesByIDs 根据文件ID批量获取文件, +// UID为0表示忽略用户,只根据文件ID检索 +// TODO 测试 func GetFilesByIDs(ids []uint, uid uint) ([]File, error) { var files []File - result := DB.Where("id in (?) AND user_id = ?", ids, uid).Find(&files) + var result *gorm.DB + if uid == 0 { + result = DB.Where("id in (?)", ids).Find(&files) + } else { + result = DB.Where("id in (?) AND user_id = ?", ids, uid).Find(&files) + } return files, result.Error } diff --git a/models/migration.go b/models/migration.go index 253e90e..b0b700d 100644 --- a/models/migration.go +++ b/models/migration.go @@ -189,6 +189,18 @@ func addDefaultGroups() { util.Log().Panic("无法创建初始注册会员用户组, %s", err) } } + + err = nil + _, err = GetGroupByID(3) + // 未找到初始游客用户组时,则创建 + if gorm.IsRecordNotFoundError(err) { + defaultAdminGroup := Group{ + Name: "游客", + } + if err := DB.Create(&defaultAdminGroup).Error; err != nil { + util.Log().Panic("无法创建初始游客用户组, %s", err) + } + } } func addDefaultUser() { diff --git a/pkg/filesystem/file.go b/pkg/filesystem/file.go index 0fa3db8..610e2f8 100644 --- a/pkg/filesystem/file.go +++ b/pkg/filesystem/file.go @@ -82,21 +82,24 @@ func (fs *FileSystem) GetContent(ctx context.Context, path string) (io.ReadSeeke } // 找到文件 - exist, file := fs.IsFileExist(path) - if !exist { - return nil, ErrObjectNotExist + if len(fs.FileTarget) == 0 { + exist, file := fs.IsFileExist(path) + if !exist { + return nil, ErrObjectNotExist + } + fs.FileTarget = []model.File{*file} + ctx = context.WithValue(ctx, fsctx.FileModelCtx, file) } - fs.FileTarget = []model.File{*file} - ctx = context.WithValue(ctx, fsctx.FileModelCtx, file) + // 将当前存储策略重设为文件使用的 - fs.Policy = file.GetPolicy() + fs.Policy = fs.FileTarget[0].GetPolicy() err = fs.dispatchHandler() if err != nil { return nil, err } // 获取文件流 - rs, err := fs.Handler.Get(ctx, file.SourceName) + rs, err := fs.Handler.Get(ctx, fs.FileTarget[0].SourceName) if err != nil { return nil, ErrIO.WithError(err) } diff --git a/pkg/filesystem/filesystem.go b/pkg/filesystem/filesystem.go index 894e877..b52aea3 100644 --- a/pkg/filesystem/filesystem.go +++ b/pkg/filesystem/filesystem.go @@ -79,6 +79,22 @@ func NewFileSystem(user *model.User) (*FileSystem, error) { return fs, err } +// NewAnonymousFileSystem 初始化匿名文件系统 +// TODO 测试 +func NewAnonymousFileSystem() (*FileSystem, error) { + fs := &FileSystem{ + User: &model.User{}, + } + + anonymousGroup, err := model.GetGroupByID(3) + if err != nil { + return nil, err + } + + fs.User.Group = anonymousGroup + return fs, nil +} + // dispatchHandler 根据存储策略分配文件适配器 func (fs *FileSystem) dispatchHandler() error { var policyType string @@ -134,3 +150,13 @@ func (fs *FileSystem) SetTargetDir(dirs *[]model.Folder) { } } + +// SetTargetFileByIDs 根据文件ID设置目标文件,忽略用户ID +func (fs *FileSystem) SetTargetFileByIDs(ids []uint) error { + files, err := model.GetFilesByIDs(ids, 0) + if err != nil || len(files) == 0 { + return ErrFileExisted.WithError(err) + } + fs.SetTargetFile(&files) + return nil +} diff --git a/pkg/serializer/error.go b/pkg/serializer/error.go index a4fe19f..bda0c33 100644 --- a/pkg/serializer/error.go +++ b/pkg/serializer/error.go @@ -64,6 +64,8 @@ const ( CodePolicyNotAllowed = 50003 // CodeIOFailed IO操作失败 CodeIOFailed = 50004 + // CodeGroupNotAllowed 当前用户组不允许 + CodeGroupNotAllowed = 50005 //CodeParamErr 各种奇奇怪怪的参数错误 CodeParamErr = 40001 // CodeNotSet 未定错误,后续尝试从error中获取 diff --git a/routers/controllers/file.go b/routers/controllers/file.go index 49ddaaf..eb24ada 100644 --- a/routers/controllers/file.go +++ b/routers/controllers/file.go @@ -23,7 +23,7 @@ func AnonymousGetContent(c *gin.Context) { defer cancel() var service explorer.FileAnonymousGetService - if err := c.ShouldBind(&service); err == nil { + if err := c.ShouldBindUri(&service); err == nil { res := service.Download(ctx, c) if res.Code != 0 { c.JSON(200, res) diff --git a/service/explorer/file.go b/service/explorer/file.go index 5df3bd2..c6f4178 100644 --- a/service/explorer/file.go +++ b/service/explorer/file.go @@ -21,6 +21,25 @@ type FileAnonymousGetService struct { // Download 签名的匿名文件下载 func (service *FileAnonymousGetService) Download(ctx context.Context, c *gin.Context) serializer.Response { + fs, err := filesystem.NewAnonymousFileSystem() + if err != nil { + return serializer.Err(serializer.CodeGroupNotAllowed, err.Error(), err) + } + + // 查找文件 + err = fs.SetTargetFileByIDs([]uint{service.ID}) + if err != nil { + return serializer.Err(serializer.CodeNotSet, err.Error(), err) + } + + // 获取文件流 + rs, err := fs.GetDownloadContent(ctx, "") + if err != nil { + return serializer.Err(serializer.CodeNotSet, err.Error(), err) + } + + // 发送文件 + http.ServeContent(c.Writer, c.Request, service.Name, fs.FileTarget[0].UpdatedAt, rs) return serializer.Response{ Code: 0,