mirror of https://github.com/cloudreve/Cloudreve
				
				
				
			Feat: preview shared text/doc file
							parent
							
								
									68704f8646
								
							
						
					
					
						commit
						0d7c0793b2
					
				| 
						 | 
				
			
			@ -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))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 需要登录保护的
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
	// 检查用户是否可以下载此分享的文件
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue