Feat: download / preview files for shared folder
This commit is contained in:
parent
0edbbfc9ea
commit
b1a9943b0c
5 changed files with 47 additions and 8 deletions
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue