From 20783738890600090b8ce41daad15e6f6719e6fd Mon Sep 17 00:00:00 2001 From: celogeek Date: Fri, 13 May 2022 23:56:09 +0200 Subject: [PATCH] cli to upload part --- cmd/photos-api-cli/upload.go | 69 +++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/cmd/photos-api-cli/upload.go b/cmd/photos-api-cli/upload.go index e5c944a..e9874f0 100644 --- a/cmd/photos-api-cli/upload.go +++ b/cmd/photos-api-cli/upload.go @@ -2,6 +2,7 @@ package main import ( "crypto/sha1" + "crypto/sha256" "encoding/hex" "errors" "fmt" @@ -31,6 +32,13 @@ type UploadCreate struct { UploadId string `json:"upload_id"` } +type UploadPartResult struct { + UploadId string `json:"upload_id"` + Part uint `json:"part"` + Size uint `json:"size"` + PartSha256 string `json:"sha256"` +} + type UploadFileRequest struct { Name string Checksum string @@ -183,19 +191,70 @@ func (c *UploadCommand) FileUpload(sum string) error { func (c *UploadCommand) Execute(args []string) error { cli := c.Cli() - resp, err := cli.R().SetError(&UploadError{}).SetResult(&UploadCreate{}).Post("/upload/create") + resp, err := cli.R().SetError(&UploadError{}).SetResult(&UploadCreate{}).Post("/upload") if err != nil { return err } if err, ok := resp.Error().(*UploadError); ok { - logger.Println(string(resp.Body())) - logger.Println(resp.Error(), resp.StatusCode(), resp.Header()) return errors.New(err.Error) } - result := resp.Result().(*UploadCreate) - fmt.Printf("Upload create: %s", result.UploadId) + uploadId := resp.Result().(*UploadCreate).UploadId + + f, err := os.Open(c.File) + if err != nil { + return err + } + defer f.Close() + st, err := f.Stat() + if err != nil { + return err + } + progress := progressbar.DefaultBytes(st.Size(), fmt.Sprintf("Uploading %s", filepath.Base(c.File))) + defer progress.Close() + tee := io.TeeReader(f, progress) + + b := make([]byte, photosapi.MaxUploadPartSize) + part := 0 + for { + n, err := tee.Read(b) + if err != nil { + if err == io.EOF { + break + } else { + return err + } + } + + part++ + partsha256 := sha256.New() + partsha256.Write(b[:n]) + + resp, err := cli. + R(). + SetError(&UploadError{}). + SetResult(&UploadPartResult{}). + SetQueryParam("part", fmt.Sprint(part)). + SetQueryParam("sha256", hex.EncodeToString(partsha256.Sum(nil))). + SetBody(b[:n]). + SetPathParam("id", uploadId). + Put("/upload/{id}") + + if err != nil { + return err + } + + if err, ok := resp.Error().(*UploadError); ok { + return errors.New(err.Error) + } + } + + fmt.Printf( + "Upload: %s\nParts: %d\n", + uploadId, + part, + ) return nil }