From 8443a30fb12b5f9ac87daec9c1ef355216a5b347 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Thu, 10 Feb 2022 19:31:06 +0800 Subject: [PATCH] Feat: support chunk size option in policy --- models/policy.go | 2 ++ pkg/filesystem/upload.go | 1 + pkg/serializer/explorer.go | 22 ++++++++++++---------- pkg/serializer/upload.go | 1 + service/explorer/upload.go | 11 +++++++++-- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/models/policy.go b/models/policy.go index e9a3d6e..25938c2 100644 --- a/models/policy.go +++ b/models/policy.go @@ -58,6 +58,8 @@ type PolicyOption struct { Region string `json:"region,omitempty"` // ServerSideEndpoint 服务端请求使用的 Endpoint,为空时使用 Policy.Server 字段 ServerSideEndpoint string `json:"server_side_endpoint,omitempty"` + // 分片上传的分片大小 + ChunkSize uint64 `json:"chunk_size,omitempty"` } var thumbSuffix = map[string][]string{ diff --git a/pkg/filesystem/upload.go b/pkg/filesystem/upload.go index 43eb539..6fa348d 100644 --- a/pkg/filesystem/upload.go +++ b/pkg/filesystem/upload.go @@ -184,6 +184,7 @@ func (fs *FileSystem) CreateUploadSession(ctx context.Context, path string, size Name: name, Size: size, SavePath: savePath, + ChunkSize: fs.Policy.OptionsSerialized.ChunkSize, } // 获取上传凭证 diff --git a/pkg/serializer/explorer.go b/pkg/serializer/explorer.go index 905f2d2..9820895 100644 --- a/pkg/serializer/explorer.go +++ b/pkg/serializer/explorer.go @@ -46,11 +46,12 @@ type Object struct { // PolicySummary 用于前端组件使用的存储策略概况 type PolicySummary struct { - ID string `json:"id"` - Name string `json:"name"` - Type string `json:"type"` - MaxSize uint64 `json:"max_size"` - FileType []string `json:"file_type"` + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + MaxSize uint64 `json:"max_size"` + FileType []string `json:"file_type"` + ChunkSize uint64 `json:"chunk_size"` } // BuildObjectList 构建列目录响应 @@ -65,11 +66,12 @@ func BuildObjectList(parent uint, objects []Object, policy *model.Policy) Object if policy != nil { res.Policy = &PolicySummary{ - ID: hashid.HashID(policy.ID, hashid.PolicyID), - Name: policy.Name, - Type: policy.Type, - MaxSize: policy.MaxSize, - FileType: policy.OptionsSerialized.FileType, + ID: hashid.HashID(policy.ID, hashid.PolicyID), + Name: policy.Name, + Type: policy.Type, + MaxSize: policy.MaxSize, + FileType: policy.OptionsSerialized.FileType, + ChunkSize: policy.OptionsSerialized.ChunkSize, } } diff --git a/pkg/serializer/upload.go b/pkg/serializer/upload.go index 825018a..2285410 100644 --- a/pkg/serializer/upload.go +++ b/pkg/serializer/upload.go @@ -38,6 +38,7 @@ type UploadSession struct { Name string Size uint64 SavePath string + ChunkSize uint64 } // UploadCallback 上传回调正文 diff --git a/service/explorer/upload.go b/service/explorer/upload.go index e82ffdf..04662b4 100644 --- a/service/explorer/upload.go +++ b/service/explorer/upload.go @@ -4,6 +4,7 @@ import ( "context" "github.com/cloudreve/Cloudreve/v3/pkg/filesystem" + "github.com/cloudreve/Cloudreve/v3/pkg/hashid" "github.com/cloudreve/Cloudreve/v3/pkg/serializer" "github.com/gin-gonic/gin" ) @@ -13,7 +14,7 @@ type UploadSessionService struct { Path string `json:"path" binding:"required"` Size uint64 `json:"size" binding:"min=0"` Name string `json:"name" binding:"required"` - PolicyID uint `json:"policy_id" binding:"required"` + PolicyID string `json:"policy_id" binding:"required"` } // Create 创建新的上传会话 @@ -24,7 +25,13 @@ func (service *UploadSessionService) Create(ctx context.Context, c *gin.Context) return serializer.Err(serializer.CodePolicyNotAllowed, err.Error(), err) } - if fs.Policy.ID != service.PolicyID { + // 取得存储策略的ID + rawID, err := hashid.DecodeHashID(service.PolicyID, hashid.PolicyID) + if err != nil { + return serializer.Err(serializer.CodeNotFound, "存储策略不存在", err) + } + + if fs.Policy.ID != rawID { return serializer.Err(serializer.CodePolicyNotAllowed, "存储策略发生变化,请刷新文件列表并重新添加此任务", nil) }