diff --git a/pkg/filesystem/file.go b/pkg/filesystem/file.go index 72e8cfb..1113441 100644 --- a/pkg/filesystem/file.go +++ b/pkg/filesystem/file.go @@ -3,6 +3,7 @@ package filesystem import ( "context" model "github.com/HFO4/cloudreve/models" + "github.com/HFO4/cloudreve/pkg/conf" "github.com/HFO4/cloudreve/pkg/filesystem/fsctx" "github.com/HFO4/cloudreve/pkg/filesystem/response" "github.com/HFO4/cloudreve/pkg/serializer" @@ -230,13 +231,13 @@ func (fs *FileSystem) GetDownloadURL(ctx context.Context, path string, timeout s // GetSource 获取可直接访问文件的外链地址 func (fs *FileSystem) GetSource(ctx context.Context, fileID uint) (string, error) { // 查找文件记录 - fileObject, err := model.GetFilesByIDs([]uint{fileID}, fs.User.ID) - if err != nil || len(fileObject) == 0 { + err := fs.resetFileIDIfNotExist(ctx, fileID) + if err != nil { return "", ErrObjectNotExist.WithError(err) } // 检查存储策略是否可以获得外链 - if !fileObject[0].GetPolicy().IsOriginLinkEnable { + if !fs.Policy.IsOriginLinkEnable { return "", serializer.NewError( serializer.CodePolicyNotAllowed, "当前存储策略无法获得外链", @@ -244,7 +245,7 @@ func (fs *FileSystem) GetSource(ctx context.Context, fileID uint) (string, error ) } - source, err := fs.signURL(ctx, &fileObject[0], 0, false) + source, err := fs.signURL(ctx, &fs.FileTarget[0], 0, false) if err != nil { return "", serializer.NewError(serializer.CodeNotSet, "无法获取外链", err) } @@ -307,6 +308,12 @@ func (fs *FileSystem) resetPolicyToFirstFile(ctx context.Context) error { if len(fs.FileTarget) == 0 { return ErrObjectNotExist } + + // 从机模式不进行操作 + if conf.SystemConfig.Mode == "slave" { + return nil + } + fs.Policy = fs.FileTarget[0].GetPolicy() err := fs.dispatchHandler() if err != nil { diff --git a/pkg/filesystem/file_test.go b/pkg/filesystem/file_test.go index 7394cc9..bdc377a 100644 --- a/pkg/filesystem/file_test.go +++ b/pkg/filesystem/file_test.go @@ -277,13 +277,13 @@ func TestFileSystem_deleteGroupedFile(t *testing.T) { func TestFileSystem_GetSource(t *testing.T) { asserts := assert.New(t) ctx := context.Background() - fs := FileSystem{ - User: &model.User{Model: gorm.Model{ID: 1}}, - } auth.General = auth.HMACAuth{SecretKey: []byte("123")} // 正常 { + fs := FileSystem{ + User: &model.User{Model: gorm.Model{ID: 1}}, + } // 清空缓存 err := cache.Deletes([]string{"siteURL"}, "setting_") asserts.NoError(err) @@ -312,6 +312,9 @@ func TestFileSystem_GetSource(t *testing.T) { // 文件不存在 { + fs := FileSystem{ + User: &model.User{Model: gorm.Model{ID: 1}}, + } // 清空缓存 err := cache.Deletes([]string{"siteURL"}, "setting_") asserts.NoError(err) @@ -332,6 +335,9 @@ func TestFileSystem_GetSource(t *testing.T) { // 未知上传策略 { + fs := FileSystem{ + User: &model.User{Model: gorm.Model{ID: 1}}, + } // 清空缓存 err := cache.Deletes([]string{"siteURL"}, "setting_") asserts.NoError(err) @@ -358,6 +364,9 @@ func TestFileSystem_GetSource(t *testing.T) { // 不允许获取外链 { + fs := FileSystem{ + User: &model.User{Model: gorm.Model{ID: 1}}, + } // 清空缓存 err := cache.Deletes([]string{"siteURL"}, "setting_") asserts.NoError(err) diff --git a/pkg/filesystem/filesystem.go b/pkg/filesystem/filesystem.go index 085ad4e..1a867bb 100644 --- a/pkg/filesystem/filesystem.go +++ b/pkg/filesystem/filesystem.go @@ -144,7 +144,6 @@ func (fs *FileSystem) dispatchHandler() error { currentPolicy = fs.Policy } - // 根据存储策略类型分配适配器 switch policyType { case "mock": return nil diff --git a/pkg/filesystem/remote/handler.go b/pkg/filesystem/remote/handler.go index 353655e..e75a7b2 100644 --- a/pkg/filesystem/remote/handler.go +++ b/pkg/filesystem/remote/handler.go @@ -106,7 +106,7 @@ func (handler Handler) Thumb(ctx context.Context, path string) (*response.Conten sourcePath := base64.RawURLEncoding.EncodeToString([]byte(path)) thumbURL := handler.getAPI("thumb") + "/" + sourcePath ttl := model.GetIntSetting("slave_api_timeout", 60) - signedThumbURL, err := auth.SignURI(handler.AuthInstance, thumbURL, int64(ttl)) + signedThumbURL, err := auth.SignURI(handler.AuthInstance, thumbURL, time.Now().Unix()+int64(ttl)) if err != nil { return nil, err } diff --git a/routers/controllers/file.go b/routers/controllers/file.go index 502e7ea..21e10b2 100644 --- a/routers/controllers/file.go +++ b/routers/controllers/file.go @@ -11,7 +11,6 @@ import ( "github.com/HFO4/cloudreve/pkg/util" "github.com/HFO4/cloudreve/service/explorer" "github.com/gin-gonic/gin" - "io" "net/http" "net/url" "strconv" @@ -130,12 +129,9 @@ func Thumb(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, resp.URL) return } - http.ServeContent(c.Writer, c.Request, "thumb.png", fs.FileTarget[0].UpdatedAt, resp.Content) - // 检查是否需要关闭文件 - if fc, ok := resp.Content.(io.Closer); ok { - defer fc.Close() - } + defer resp.Content.Close() + http.ServeContent(c.Writer, c.Request, "thumb.png", fs.FileTarget[0].UpdatedAt, resp.Content) } diff --git a/service/explorer/file.go b/service/explorer/file.go index 1e1215e..d6bb7fa 100644 --- a/service/explorer/file.go +++ b/service/explorer/file.go @@ -388,5 +388,16 @@ func (service *SlaveFileService) Thumb(ctx context.Context, c *gin.Context) seri if err != nil { return serializer.ParamErr("无法解析的文件地址", err) } + fs.FileTarget = []model.File{{SourceName: string(fileSource), PicInfo: "1,1"}} + // 获取缩略图 + resp, err := fs.GetThumb(ctx, 0) + if err != nil { + return serializer.Err(serializer.CodeNotSet, "无法获取缩略图", err) + } + + defer resp.Content.Close() + http.ServeContent(c.Writer, c.Request, "thumb.png", time.Now(), resp.Content) + + return serializer.Response{Code: 0} }