diff --git a/pkg/request/request.go b/pkg/request/request.go index 98a523d..aaf69d2 100644 --- a/pkg/request/request.go +++ b/pkg/request/request.go @@ -243,6 +243,9 @@ func (instance NopRSCloser) SetContentLength(size int64) { // Read 实现 NopRSCloser reader func (instance NopRSCloser) Read(p []byte) (n int, err error) { + if instance.status.IgnoreFirst && len(p) == 512 { + return 0, io.EOF + } return instance.body.Read(p) } diff --git a/routers/controllers/share.go b/routers/controllers/share.go index 754cae8..326067b 100644 --- a/routers/controllers/share.go +++ b/routers/controllers/share.go @@ -2,8 +2,13 @@ package controllers import ( "context" + model "github.com/HFO4/cloudreve/models" + "github.com/HFO4/cloudreve/pkg/serializer" + "github.com/HFO4/cloudreve/pkg/util" "github.com/HFO4/cloudreve/service/share" "github.com/gin-gonic/gin" + "path" + "strings" ) // CreateShare 创建分享 @@ -80,6 +85,38 @@ func PreviewShareText(c *gin.Context) { } } +// PreviewShareReadme 预览文本自述文件 +func PreviewShareReadme(c *gin.Context) { + // 创建上下文 + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + var service share.Service + if err := c.ShouldBindQuery(&service); err == nil { + // 自述文件名限制 + allowFileName := []string{"readme.txt", "readme.md"} + fileName := strings.ToLower(path.Base(service.Path)) + if !util.ContainsString(allowFileName, fileName) { + c.JSON(200, serializer.ParamErr("非README文件", nil)) + } + + // 必须是目录分享 + if shareCtx, ok := c.Get("share"); ok { + if !shareCtx.(*model.Share).IsDir { + c.JSON(200, serializer.ParamErr("此分享无自述文件", 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.Service diff --git a/routers/router.go b/routers/router.go index 952aa69..a6616d8 100644 --- a/routers/router.go +++ b/routers/router.go @@ -209,6 +209,11 @@ func InitMasterRouter() *gin.Engine { middleware.BeforeShareDownload(), controllers.ArchiveShare, ) + // 获取README文本文件内容 + share.GET("readme/:id", + middleware.CheckShareUnlocked(), + controllers.PreviewShareReadme, + ) } // 需要登录保护的 diff --git a/service/explorer/file.go b/service/explorer/file.go index 3eba150..9d0da1d 100644 --- a/service/explorer/file.go +++ b/service/explorer/file.go @@ -255,6 +255,10 @@ func (service *SingleFileService) PreviewContent(ctx context.Context, c *gin.Con // 直接返回文件内容 defer resp.Content.Close() + if isText { + c.Header("Cache-Control", "no-cache") + } + http.ServeContent(c.Writer, c.Request, fs.FileTarget[0].Name, fs.FileTarget[0].UpdatedAt, resp.Content) return serializer.Response{