From e96b5956226ad348a83b0fe0da30c48c941a0573 Mon Sep 17 00:00:00 2001 From: Aaron Liu Date: Tue, 15 Jul 2025 13:22:04 +0800 Subject: [PATCH] feat(direct link): add option to get direct link with download enforced (#2651) --- assets | 2 +- pkg/filemanager/manager/entity.go | 4 ++-- routers/controllers/file.go | 14 ++++++++------ routers/router.go | 5 ++++- service/explorer/file.go | 3 ++- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/assets b/assets index 3a6a22b..e47a708 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 3a6a22bb458783fcfd32f3b35f5fe6afc5414e25 +Subproject commit e47a708f727bf5243512ddd6d9c6eabd5bf61751 diff --git a/pkg/filemanager/manager/entity.go b/pkg/filemanager/manager/entity.go index a8954bc..bf88ef7 100644 --- a/pkg/filemanager/manager/entity.go +++ b/pkg/filemanager/manager/entity.go @@ -168,7 +168,7 @@ func (m *manager) GetUrlForRedirectedDirectLink(ctx context.Context, dl *ent.Dir ) // Try to read from cache. - cacheKey := entityUrlCacheKey(primaryEntity.ID(), int64(dl.Speed), dl.Name, false, + cacheKey := entityUrlCacheKey(primaryEntity.ID(), int64(dl.Speed), dl.Name, o.IsDownload, m.settings.SiteURL(ctx).String()) if cached, ok := m.kv.Get(cacheKey); ok { cachedItem := cached.(EntityUrlCache) @@ -185,7 +185,7 @@ func (m *manager) GetUrlForRedirectedDirectLink(ctx context.Context, dl *ent.Dir m.l, m.config, m.dep.MimeDetector(ctx)) downloadUrl, err := source.Url(ctx, entitysource.WithExpire(o.Expire), - entitysource.WithDownload(false), + entitysource.WithDownload(o.IsDownload), entitysource.WithSpeedLimit(int64(dl.Speed)), entitysource.WithDisplayName(dl.Name), ) diff --git a/routers/controllers/file.go b/routers/controllers/file.go index dab661a..e09a95f 100644 --- a/routers/controllers/file.go +++ b/routers/controllers/file.go @@ -86,12 +86,14 @@ func ExtractArchive(c *gin.Context) { } // AnonymousPermLink 文件中转后的永久直链接 -func AnonymousPermLink(c *gin.Context) { - name := c.Param("name") - if err := explorer.RedirectDirectLink(c, name); err != nil { - c.JSON(404, serializer.Err(c, err)) - c.Abort() - return +func AnonymousPermLink(download bool) gin.HandlerFunc { + return func(c *gin.Context) { + name := c.Param("name") + if err := explorer.RedirectDirectLink(c, name, download); err != nil { + c.JSON(404, serializer.Err(c, err)) + c.Abort() + return + } } } diff --git a/routers/router.go b/routers/router.go index f589720..27b39cc 100644 --- a/routers/router.go +++ b/routers/router.go @@ -245,7 +245,10 @@ func initMasterRouter(dep dependency.Dep) *gin.Engine { { source.GET(":id/:name", middleware.HashID(hashid.SourceLinkID), - controllers.AnonymousPermLink) + controllers.AnonymousPermLink(false)) + source.GET("d/:id/:name", + middleware.HashID(hashid.SourceLinkID), + controllers.AnonymousPermLink(true)) } shareShort := r.Group("s") diff --git a/service/explorer/file.go b/service/explorer/file.go index b207582..02ca564 100644 --- a/service/explorer/file.go +++ b/service/explorer/file.go @@ -659,7 +659,7 @@ func (s *GetFileInfoService) Get(c *gin.Context) (*FileResponse, error) { return BuildFileResponse(c, user, file, dep.HashIDEncoder(), nil), nil } -func RedirectDirectLink(c *gin.Context, name string) error { +func RedirectDirectLink(c *gin.Context, name string, download bool) error { dep := dependency.FromContext(c) settings := dep.SettingProvider() @@ -680,6 +680,7 @@ func RedirectDirectLink(c *gin.Context, name string) error { expire := time.Now().Add(settings.EntityUrlValidDuration(c)) res, earliestExpire, err := m.GetUrlForRedirectedDirectLink(c, dl, fs.WithUrlExpire(&expire), + fs.WithIsDownload(download), ) if err != nil { return err