diff --git a/pkg/filesystem/fsctx/context.go b/pkg/filesystem/fsctx/context.go index 28aef97..ff53258 100644 --- a/pkg/filesystem/fsctx/context.go +++ b/pkg/filesystem/fsctx/context.go @@ -13,6 +13,8 @@ const ( PathCtx // FileModelCtx 文件数据库模型 FileModelCtx + // FolderModelCtx 目录数据库模型 + FolderModelCtx // HTTPCtx HTTP请求的上下文 HTTPCtx // UploadPolicyCtx 上传策略,一般为slave模式下使用 @@ -25,4 +27,6 @@ const ( OriginSourceNameCtx // FileSizeCtx 文件大小 FileSizeCtx + // ShareKeyCtx 分享文件的 HashID + ShareKeyCtx ) diff --git a/pkg/filesystem/manage.go b/pkg/filesystem/manage.go index 5c3bba6..3b24bae 100644 --- a/pkg/filesystem/manage.go +++ b/pkg/filesystem/manage.go @@ -4,6 +4,7 @@ import ( "context" "fmt" model "github.com/HFO4/cloudreve/models" + "github.com/HFO4/cloudreve/pkg/filesystem/fsctx" "github.com/HFO4/cloudreve/pkg/serializer" "github.com/HFO4/cloudreve/pkg/util" "path" @@ -24,6 +25,7 @@ type Object struct { Size uint64 `json:"size"` Type string `json:"type"` Date string `json:"date"` + Key string `json:"key,omitempty"` } // Rename 重命名对象 @@ -260,6 +262,12 @@ func (fs *FileSystem) List(ctx context.Context, dirPath string, pathProcessor fu var childFolders []model.Folder var childFiles []model.File + // 分享文件的ID + shareKey := "" + if key, ok := ctx.Value(fsctx.ShareKeyCtx).(string); ok { + shareKey = key + } + // 获取子目录 childFolders, _ = folder.GetChildFolder() @@ -302,7 +310,7 @@ func (fs *FileSystem) List(ctx context.Context, dirPath string, pathProcessor fu } } - objects = append(objects, Object{ + newFile := Object{ ID: file.ID, Name: file.Name, Path: processedPath, @@ -310,7 +318,11 @@ func (fs *FileSystem) List(ctx context.Context, dirPath string, pathProcessor fu Size: file.Size, Type: "file", Date: file.CreatedAt.Format("2006-01-02 15:04:05"), - }) + } + if shareKey != "" { + newFile.Key = shareKey + } + objects = append(objects, newFile) } return objects, nil diff --git a/routers/router.go b/routers/router.go index cd70cf2..5a019d4 100644 --- a/routers/router.go +++ b/routers/router.go @@ -173,7 +173,7 @@ func InitMasterRouter() *gin.Engine { // 获取分享 share.GET("info/:id", controllers.GetShare) // 创建文件下载会话 - share.POST("download/:id", + share.PUT("download/:id", middleware.CheckShareUnlocked(), middleware.BeforeShareDownload(), controllers.GetShareDownload, diff --git a/service/explorer/file.go b/service/explorer/file.go index 12174be..bce2940 100644 --- a/service/explorer/file.go +++ b/service/explorer/file.go @@ -133,6 +133,11 @@ func (service *SingleFileService) CreateDocPreviewSession(ctx context.Context, c fs.SetTargetFile(&[]model.File{*file}) } + // 如果上下文中已有Folder对象,则重设目标 + if folder, ok := ctx.Value(fsctx.FolderModelCtx).(*model.Folder); ok { + fs.SetTargetDir(&[]model.Folder{*folder}) + } + // 获取文件临时下载地址 downloadURL, err := fs.GetDownloadURL(ctx, service.Path, "doc_preview_timeout") if err != nil { @@ -228,6 +233,11 @@ func (service *SingleFileService) PreviewContent(ctx context.Context, c *gin.Con fs.SetTargetFile(&[]model.File{*file}) } + // 如果上下文中已有Folder对象,则重设目标 + if folder, ok := ctx.Value(fsctx.FolderModelCtx).(*model.Folder); ok { + fs.SetTargetDir(&[]model.Folder{*folder}) + } + // 获取文件预览响应 resp, err := fs.Preview(ctx, service.Path, isText) if err != nil { diff --git a/service/share/visit.go b/service/share/visit.go index 6c4f2e3..f79eb1e 100644 --- a/service/share/visit.go +++ b/service/share/visit.go @@ -6,6 +6,7 @@ import ( model "github.com/HFO4/cloudreve/models" "github.com/HFO4/cloudreve/pkg/filesystem" "github.com/HFO4/cloudreve/pkg/filesystem/fsctx" + "github.com/HFO4/cloudreve/pkg/hashid" "github.com/HFO4/cloudreve/pkg/serializer" "github.com/HFO4/cloudreve/pkg/util" "github.com/HFO4/cloudreve/service/explorer" @@ -81,7 +82,7 @@ func (service *ShareService) CreateDownloadSession(c *gin.Context) serializer.Re } // 取得下载地址 - downloadURL, err := fs.GetDownloadURL(context.Background(), "", "download_timeout") + downloadURL, err := fs.GetDownloadURL(context.Background(), service.Path, "download_timeout") if err != nil { return serializer.Err(serializer.CodeNotSet, err.Error(), err) } @@ -99,9 +100,13 @@ func (service *ShareService) PreviewContent(ctx context.Context, c *gin.Context, share := shareCtx.(*model.Share) // 用于调下层service - ctx = context.WithValue(ctx, fsctx.FileModelCtx, share.GetSource()) + if share.IsDir { + ctx = context.WithValue(ctx, fsctx.FolderModelCtx, share.GetSource()) + } else { + ctx = context.WithValue(ctx, fsctx.FileModelCtx, share.GetSource()) + } subService := explorer.SingleFileService{ - Path: "", + Path: service.Path, } return subService.PreviewContent(ctx, c, isText) @@ -113,9 +118,14 @@ func (service *ShareService) CreateDocPreviewSession(c *gin.Context) serializer. share := shareCtx.(*model.Share) // 用于调下层service - ctx := context.WithValue(context.Background(), fsctx.FileModelCtx, share.GetSource()) + ctx := context.Background() + if share.IsDir { + ctx = context.WithValue(ctx, fsctx.FolderModelCtx, share.GetSource()) + } else { + ctx = context.WithValue(ctx, fsctx.FileModelCtx, share.GetSource()) + } subService := explorer.SingleFileService{ - Path: "", + Path: service.Path, } return subService.CreateDocPreviewSession(ctx, c) @@ -182,6 +192,9 @@ func (service *ShareService) List(c *gin.Context) serializer.Response { fs.SetTargetDir(&[]model.Folder{*share.GetSource().(*model.Folder)}) fs.DirTarget[0].Name = "/" + // 分享Key上下文 + ctx = context.WithValue(ctx, fsctx.ShareKeyCtx, hashid.HashID(share.ID, hashid.ShareID)) + // 获取子项目 objects, err := fs.List(ctx, service.Path, nil) if err != nil {