You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

multipart.go 2.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package ops2
  2. import (
  3. "encoding/json"
  4. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag"
  5. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec"
  6. "gitlink.org.cn/cloudream/common/sdks/cloudstorage"
  7. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  8. )
  9. func init() {
  10. exec.UseOp[*MultipartManage]()
  11. exec.UseOp[*MultipartUpload]()
  12. }
  13. type MultipartManage struct {
  14. Address cdssdk.StorageAddress `json:"address"`
  15. UploadID *exec.VarID `json:"uploadID"`
  16. ObjectID *exec.VarID `json:"objectID"`
  17. }
  18. func (o *MultipartManage) Execute(ctx *exec.ExecContext, e *exec.Executor) error {
  19. var oss cloudstorage.ObjectStorage
  20. switch addr := o.Address.(type) {
  21. case *cdssdk.LocalStorageAddress:
  22. err := json.Unmarshal([]byte(addr.String()), &oss)
  23. if err != nil {
  24. return err
  25. }
  26. }
  27. client, err := cloudstorage.NewObjectStorageClient(oss)
  28. if err != nil {
  29. return err
  30. }
  31. defer client.Close()
  32. uploadID, err := client.InitiateMultipartUpload("")
  33. if err != nil {
  34. return err
  35. }
  36. objectID, err := client.CompleteMultipartUpload()
  37. if err != nil {
  38. return err
  39. }
  40. o.ObjectID.Value = objectID
  41. e.PutVars(o.ObjectID)
  42. return nil
  43. }
  44. func (o *MultipartManage) String() string {
  45. return "MultipartManage"
  46. }
  47. type MultipartManageNode struct {
  48. dag.NodeBase
  49. Address cdssdk.StorageAddress
  50. }
  51. func (b *GraphNodeBuilder) NewMultipartManage(addr cdssdk.StorageAddress) *MultipartManageNode {
  52. node := &MultipartManageNode{
  53. Address: addr,
  54. }
  55. b.AddNode(node)
  56. return node
  57. }
  58. func (t *MultipartManageNode) GenerateOp() (exec.Op, error) {
  59. return &MultipartManage{
  60. Address: t.Address,
  61. }, nil
  62. }
  63. type MultipartUpload struct {
  64. Address cdssdk.StorageAddress `json:"address"`
  65. FileMD5 *exec.VarID `json:"fileMD5"`
  66. }
  67. func (o *MultipartUpload) Execute(ctx *exec.ExecContext, e *exec.Executor) error {
  68. var oss cloudstorage.ObjectStorage
  69. switch addr := o.Address.(type) {
  70. case *cdssdk.LocalStorageAddress:
  71. err := json.Unmarshal([]byte(addr.String()), &oss)
  72. if err != nil {
  73. return err
  74. }
  75. }
  76. client, err := cloudstorage.NewObjectStorageClient(oss)
  77. if err != nil {
  78. return err
  79. }
  80. client.UploadPart()
  81. return nil
  82. }
  83. func (o *MultipartUpload) String() string {
  84. return "MultipartUpload"
  85. }
  86. type MultipartUploadNode struct {
  87. dag.NodeBase
  88. Address cdssdk.StorageAddress
  89. }
  90. func (b *GraphNodeBuilder) NewMultipartUpload(addr cdssdk.StorageAddress) *MultipartUploadNode {
  91. node := &MultipartUploadNode{
  92. Address: addr,
  93. }
  94. b.AddNode(node)
  95. return node
  96. }
  97. func (t MultipartUploadNode) GenerateOp() (exec.Op, error) {
  98. return &MultipartUpload{
  99. Address: t.Address,
  100. }, nil
  101. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。