From 0d7c0793b2f05df87403c5c2224958d46e5fe16b Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Wed, 29 Jan 2020 12:16:52 +0800 Subject: [PATCH] Feat: preview shared text/doc file --- routers/controllers/share.go | 31 ++++++++++++++++++++++++++++++- routers/router.go | 4 ++++ service/explorer/file.go | 5 +++++ service/share/visit.go | 27 +++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/routers/controllers/share.go b/routers/controllers/share.go index 6d18bf8..25199f0 100644 --- a/routers/controllers/share.go +++ b/routers/controllers/share.go @@ -46,7 +46,7 @@ func PreviewShare(c *gin.Context) { defer cancel() var service share.SingleFileService - if err := c.ShouldBindUri(&service); err == nil { + if err := c.ShouldBindQuery(&service); err == nil { res := service.PreviewContent(ctx, c, false) // 是否需要重定向 if res.Code == -301 { @@ -61,3 +61,32 @@ func PreviewShare(c *gin.Context) { c.JSON(200, ErrorResponse(err)) } } + +// PreviewShareText 预览文本文件 +func PreviewShareText(c *gin.Context) { + // 创建上下文 + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + var service share.SingleFileService + if err := c.ShouldBindQuery(&service); err == nil { + res := service.PreviewContent(ctx, c, true) + // 是否有错误发生 + if res.Code != 0 { + c.JSON(200, res) + } + } else { + c.JSON(200, ErrorResponse(err)) + } +} + +// GetShareDocPreview 创建分享Office文档预览地址 +func GetShareDocPreview(c *gin.Context) { + var service share.SingleFileService + if err := c.ShouldBindQuery(&service); err == nil { + res := service.CreateDocPreviewSession(c) + c.JSON(200, res) + } else { + c.JSON(200, ErrorResponse(err)) + } +} diff --git a/routers/router.go b/routers/router.go index 00aa1bd..00668f7 100644 --- a/routers/router.go +++ b/routers/router.go @@ -176,6 +176,10 @@ func InitMasterRouter() *gin.Engine { share.POST("download/:id", controllers.GetShareDownload) // 预览分享文件 share.GET("preview/:id", controllers.PreviewShare) + // 取得Office文档预览地址 + share.GET("doc/:id", controllers.GetShareDocPreview) + // 获取文本文件内容 + share.GET("content/:id", controllers.PreviewShareText) } // 需要登录保护的 diff --git a/service/explorer/file.go b/service/explorer/file.go index 065950d..12174be 100644 --- a/service/explorer/file.go +++ b/service/explorer/file.go @@ -128,6 +128,11 @@ func (service *SingleFileService) CreateDocPreviewSession(ctx context.Context, c } defer fs.Recycle() + // 如果上下文中已有File对象,则重设目标 + if file, ok := ctx.Value(fsctx.FileModelCtx).(*model.File); ok { + fs.SetTargetFile(&[]model.File{*file}) + } + // 获取文件临时下载地址 downloadURL, err := fs.GetDownloadURL(ctx, service.Path, "doc_preview_timeout") if err != nil { diff --git a/service/share/visit.go b/service/share/visit.go index 9bf8d14..9278612 100644 --- a/service/share/visit.go +++ b/service/share/visit.go @@ -127,6 +127,33 @@ func (service *SingleFileService) PreviewContent(ctx context.Context, c *gin.Con return subService.PreviewContent(ctx, c, isText) } +// CreateDocPreviewSession 创建Office预览会话,返回预览地址 +func (service *SingleFileService) CreateDocPreviewSession(c *gin.Context) serializer.Response { + user := currentUser(c) + share := model.GetShareByHashID(c.Param("id")) + if share == nil || !share.IsAvailable() { + return serializer.Err(serializer.CodeNotFound, "分享不存在或已被取消", nil) + } + + if !share.PreviewEnabled { + return serializer.Err(serializer.CodeNoPermissionErr, "此分享无法预览", nil) + } + + // 检查用户是否可以下载此分享的文件 + err := CheckBeforeGetShare(share, user, c) + if err != nil { + return serializer.Err(serializer.CodeNoPermissionErr, err.Error(), nil) + } + + // 用于调下层service + ctx := context.WithValue(context.Background(), fsctx.FileModelCtx, share.GetSource()) + subService := explorer.SingleFileService{ + Path: "", + } + + return subService.CreateDocPreviewSession(ctx, c) +} + // CheckBeforeGetShare 获取分享内容/下载前进行的一系列检查 func CheckBeforeGetShare(share *model.Share, user *model.User, c *gin.Context) error { // 检查用户是否可以下载此分享的文件 -- GitLab