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.

put.go 3.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package cmdline
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "time"
  8. "github.com/inhies/go-bytesize"
  9. "github.com/spf13/cobra"
  10. "gitlink.org.cn/cloudream/common/consts/errorcode"
  11. "gitlink.org.cn/cloudream/common/pkgs/mq"
  12. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  13. "gitlink.org.cn/cloudream/storage/common/pkgs/iterator"
  14. )
  15. func init() {
  16. var stgID int64
  17. cmd := &cobra.Command{
  18. Use: "put [local] [remote]",
  19. Short: "Upload files to CDS",
  20. Args: func(cmd *cobra.Command, args []string) error {
  21. if err := cobra.ExactArgs(2)(cmd, args); err != nil {
  22. return err
  23. }
  24. remote := args[1]
  25. comps := strings.Split(strings.Trim(remote, cdssdk.ObjectPathSeparator), cdssdk.ObjectPathSeparator)
  26. if len(comps) != 2 {
  27. return fmt.Errorf("invalid remote path: %s, which must be in format of <bucket>/<package>", remote)
  28. }
  29. return nil
  30. },
  31. Run: func(cmd *cobra.Command, args []string) {
  32. userID := cdssdk.UserID(1)
  33. cmdCtx := GetCmdCtx(cmd)
  34. local := args[0]
  35. remote := args[1]
  36. comps := strings.Split(strings.Trim(remote, cdssdk.ObjectPathSeparator), cdssdk.ObjectPathSeparator)
  37. startTime := time.Now()
  38. bkt, err := cmdCtx.Cmdline.Svc.BucketSvc().GetBucketByName(userID, comps[0])
  39. if err != nil {
  40. fmt.Printf("getting bucket: %v\n", err)
  41. return
  42. }
  43. pkg, err := cmdCtx.Cmdline.Svc.PackageSvc().GetByName(userID, comps[0], comps[1])
  44. if err != nil {
  45. if codeMsg, ok := err.(*mq.CodeMessageError); ok && codeMsg.Code == errorcode.DataNotFound {
  46. pkg2, err := cmdCtx.Cmdline.Svc.PackageSvc().Create(userID, bkt.BucketID, comps[1])
  47. if err != nil {
  48. fmt.Printf("creating package: %v\n", err)
  49. return
  50. }
  51. pkg = &pkg2
  52. } else {
  53. fmt.Printf("getting package: %v\n", err)
  54. return
  55. }
  56. }
  57. var fileCount int
  58. var totalSize int64
  59. var uploadFilePathes []string
  60. err = filepath.WalkDir(local, func(fname string, fi os.DirEntry, err error) error {
  61. if err != nil {
  62. return nil
  63. }
  64. if !fi.IsDir() {
  65. uploadFilePathes = append(uploadFilePathes, fname)
  66. fileCount++
  67. info, err := fi.Info()
  68. if err == nil {
  69. totalSize += info.Size()
  70. }
  71. }
  72. return nil
  73. })
  74. if err != nil {
  75. fmt.Printf("walking directory: %v\n", err)
  76. return
  77. }
  78. var storageAff cdssdk.StorageID
  79. if stgID != 0 {
  80. storageAff = cdssdk.StorageID(stgID)
  81. }
  82. objIter := iterator.NewUploadingObjectIterator(local, uploadFilePathes)
  83. taskID, err := cmdCtx.Cmdline.Svc.ObjectSvc().StartUploading(userID, pkg.PackageID, objIter, storageAff)
  84. if err != nil {
  85. fmt.Printf("start uploading objects: %v\n", err)
  86. return
  87. }
  88. for {
  89. complete, _, err := cmdCtx.Cmdline.Svc.ObjectSvc().WaitUploading(taskID, time.Second*5)
  90. if err != nil {
  91. fmt.Printf("uploading objects: %v\n", err)
  92. return
  93. }
  94. if complete {
  95. break
  96. }
  97. }
  98. fmt.Printf("Put %v files (%v) to %s in %v.\n", fileCount, bytesize.ByteSize(totalSize), remote, time.Since(startTime))
  99. },
  100. }
  101. cmd.Flags().Int64VarP(&stgID, "storage", "s", 0, "storage affinity")
  102. rootCmd.AddCommand(cmd)
  103. }

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