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.

puto.go 2.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package puto
  2. import (
  3. "fmt"
  4. "os"
  5. "strconv"
  6. "time"
  7. "github.com/inhies/go-bytesize"
  8. "github.com/spf13/cobra"
  9. "gitlink.org.cn/cloudream/common/pkgs/iterator"
  10. cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1"
  11. clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types"
  12. "gitlink.org.cn/cloudream/jcs-pub/jcsctl/cmd"
  13. )
  14. func init() {
  15. var opt option
  16. c := &cobra.Command{
  17. Use: "puto <local_path> <bucket_name>/<package_name>:<object_path>",
  18. Short: "upload local file as a object",
  19. Args: cobra.ExactArgs(2),
  20. RunE: func(c *cobra.Command, args []string) error {
  21. ctx := cmd.GetCmdCtx(c)
  22. return puto(c, ctx, opt, args)
  23. },
  24. }
  25. c.Flags().BoolVar(&opt.UseID, "id", false, "treat the second argument as object id")
  26. cmd.RootCmd.AddCommand(c)
  27. }
  28. type option struct {
  29. UseID bool
  30. }
  31. func puto(c *cobra.Command, ctx *cmd.CommandContext, opt option, args []string) error {
  32. var pkgID clitypes.PackageID
  33. var objPath string
  34. if opt.UseID {
  35. id, err := strconv.ParseInt(args[1], 10, 64)
  36. if err != nil {
  37. return fmt.Errorf("invalid object id: %v", err)
  38. }
  39. resp, err := ctx.Client.Object().ListByIDs(cliapi.ObjectListByIDs{
  40. ObjectIDs: []clitypes.ObjectID{clitypes.ObjectID(id)},
  41. })
  42. if err != nil {
  43. return fmt.Errorf("list objects by ids: %v", err)
  44. }
  45. if resp.Objects[0] == nil {
  46. return fmt.Errorf("object not found")
  47. }
  48. pkgID = resp.Objects[0].PackageID
  49. objPath = resp.Objects[0].Path
  50. } else {
  51. bkt, pkg, objPath2, ok := cmd.SplitObjectPath(args[1])
  52. if !ok {
  53. return fmt.Errorf("invalid object path")
  54. }
  55. pkgResp, err := ctx.Client.Package().GetByFullName(cliapi.PackageGetByFullName{
  56. BucketName: bkt,
  57. PackageName: pkg,
  58. })
  59. if err != nil {
  60. return fmt.Errorf("get package by name: %v", err)
  61. }
  62. pkgID = pkgResp.Package.PackageID
  63. objPath = objPath2
  64. }
  65. file, err := os.Open(args[0])
  66. if err != nil {
  67. return fmt.Errorf("open file: %v", err)
  68. }
  69. defer file.Close()
  70. info, err := file.Stat()
  71. if err != nil {
  72. return err
  73. }
  74. fmt.Printf("%v\n", objPath)
  75. startTime := time.Now()
  76. _, err = ctx.Client.Object().Upload(cliapi.ObjectUpload{
  77. Info: cliapi.ObjectUploadInfo{
  78. PackageID: pkgID,
  79. },
  80. Files: iterator.Array(&cliapi.UploadingObject{
  81. Path: objPath,
  82. File: file,
  83. }),
  84. })
  85. if err != nil {
  86. return fmt.Errorf("upload file %v: %w", objPath, err)
  87. }
  88. dt := time.Since(startTime)
  89. fmt.Printf("size: %v, time: %v, speed: %v/s\n", bytesize.ByteSize(info.Size()), dt, bytesize.ByteSize(int64(float64(info.Size())/dt.Seconds())))
  90. return nil
  91. }

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