From 6ee1a0592004d094573e2e0bb54d5f2a628187af Mon Sep 17 00:00:00 2001 From: JeshuaRen <270813223@qq.com> Date: Fri, 25 Oct 2024 16:39:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=AE=B5=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/pkgs/ioswitch2/ops2/multipart.go | 124 ++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 common/pkgs/ioswitch2/ops2/multipart.go diff --git a/common/pkgs/ioswitch2/ops2/multipart.go b/common/pkgs/ioswitch2/ops2/multipart.go new file mode 100644 index 0000000..0ef7da6 --- /dev/null +++ b/common/pkgs/ioswitch2/ops2/multipart.go @@ -0,0 +1,124 @@ +package ops2 + +import ( + "encoding/json" + "gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag" + "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec" + "gitlink.org.cn/cloudream/common/sdks/cloudstorage" + cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" +) + +func init() { + exec.UseOp[*MultipartManage]() + exec.UseOp[*MultipartUpload]() +} + +type MultipartManage struct { + Address cdssdk.StorageAddress `json:"address"` + UploadID *exec.StringVar `json:"uploadID"` + ObjectID *exec.StringVar `json:"objectID"` +} + +func (o *MultipartManage) Execute(ctx *exec.ExecContext, e *exec.Executor) error { + + var oss cloudstorage.ObjectStorage + + switch addr := o.Address.(type) { + case *cdssdk.LocalStorageAddress: + err := json.Unmarshal([]byte(addr.String()), &oss) + if err != nil { + return err + } + } + + client, err := cloudstorage.NewObjectStorageClient(oss) + if err != nil { + return err + } + defer client.Close() + + uploadID, err := client.InitiateMultipartUpload("") + if err != nil { + return err + } + o.UploadID.Value = uploadID + e.PutVars(o.UploadID) + + objectID, err := client.CompleteMultipartUpload() + if err != nil { + return err + } + o.ObjectID.Value = objectID + e.PutVars(o.ObjectID) + + return nil +} + +func (o *MultipartManage) String() string { + return "MultipartManage" +} + +type MultipartManageNode struct { + dag.NodeBase + Address cdssdk.StorageAddress +} + +func (b *GraphNodeBuilder) NewMultipartManage(addr cdssdk.StorageAddress) *MultipartManageNode { + node := &MultipartManageNode{ + Address: addr, + } + b.AddNode(node) + return node +} + +func (t *MultipartManageNode) GenerateOp() (exec.Op, error) { + return &MultipartManage{ + Address: t.Address, + }, nil +} + +type MultipartUpload struct { + Address cdssdk.StorageAddress `json:"address"` + FileMD5 *exec.StringVar `json:"fileMD5"` +} + +func (o *MultipartUpload) Execute(ctx *exec.ExecContext, e *exec.Executor) error { + var oss cloudstorage.ObjectStorage + switch addr := o.Address.(type) { + case *cdssdk.LocalStorageAddress: + err := json.Unmarshal([]byte(addr.String()), &oss) + if err != nil { + return err + } + } + + client, err := cloudstorage.NewObjectStorageClient(oss) + if err != nil { + return err + } + client.UploadPart() + return nil +} + +func (o *MultipartUpload) String() string { + return "MultipartUpload" +} + +type MultipartUploadNode struct { + dag.NodeBase + Address cdssdk.StorageAddress +} + +func (b *GraphNodeBuilder) NewMultipartUpload(addr cdssdk.StorageAddress) *MultipartUploadNode { + node := &MultipartUploadNode{ + Address: addr, + } + b.AddNode(node) + return node +} + +func (t MultipartUploadNode) GenerateOp() (exec.Op, error) { + return &MultipartUpload{ + Address: t.Address, + }, nil +}