package puto import ( "fmt" "os" "strconv" "time" "github.com/inhies/go-bytesize" "github.com/spf13/cobra" "gitlink.org.cn/cloudream/common/pkgs/iterator" cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1" clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types" "gitlink.org.cn/cloudream/jcs-pub/jcsctl/cmd" ) func init() { var opt option c := &cobra.Command{ Use: "puto /:", Short: "upload local file as a object", Args: cobra.ExactArgs(2), RunE: func(c *cobra.Command, args []string) error { ctx := cmd.GetCmdCtx(c) return puto(c, ctx, opt, args) }, } c.Flags().BoolVar(&opt.UseID, "id", false, "treat the second argument as object id") cmd.RootCmd.AddCommand(c) } type option struct { UseID bool } func puto(c *cobra.Command, ctx *cmd.CommandContext, opt option, args []string) error { var pkgID clitypes.PackageID var objPath string if opt.UseID { id, err := strconv.ParseInt(args[1], 10, 64) if err != nil { return fmt.Errorf("invalid object id: %v", err) } resp, err := ctx.Client.Object().ListByIDs(cliapi.ObjectListByIDs{ ObjectIDs: []clitypes.ObjectID{clitypes.ObjectID(id)}, }) if err != nil { return fmt.Errorf("list objects by ids: %v", err) } if resp.Objects[0] == nil { return fmt.Errorf("object not found") } pkgID = resp.Objects[0].PackageID objPath = resp.Objects[0].Path } else { bkt, pkg, objPath2, ok := cmd.SplitObjectPath(args[1]) if !ok { return fmt.Errorf("invalid object path") } pkgResp, err := ctx.Client.Package().GetByFullName(cliapi.PackageGetByFullName{ BucketName: bkt, PackageName: pkg, }) if err != nil { return fmt.Errorf("get package by name: %v", err) } pkgID = pkgResp.Package.PackageID objPath = objPath2 } file, err := os.Open(args[0]) if err != nil { return fmt.Errorf("open file: %v", err) } defer file.Close() info, err := file.Stat() if err != nil { return err } fmt.Printf("%v\n", objPath) startTime := time.Now() _, err = ctx.Client.Object().Upload(cliapi.ObjectUpload{ ObjectUploadInfo: cliapi.ObjectUploadInfo{ PackageID: pkgID, }, Files: iterator.Array(&cliapi.UploadingObject{ Path: objPath, File: file, }), }) if err != nil { return fmt.Errorf("upload file %v: %w", objPath, err) } dt := time.Since(startTime) fmt.Printf("size: %v, time: %v, speed: %v/s\n", bytesize.ByteSize(info.Size()), dt, bytesize.ByteSize(int64(float64(info.Size())/dt.Seconds()))) return nil }