cli to upload part
This commit is contained in:
parent
b37890a9e6
commit
2078373889
@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
|
"crypto/sha256"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -31,6 +32,13 @@ type UploadCreate struct {
|
|||||||
UploadId string `json:"upload_id"`
|
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 {
|
type UploadFileRequest struct {
|
||||||
Name string
|
Name string
|
||||||
Checksum string
|
Checksum string
|
||||||
@ -183,19 +191,70 @@ func (c *UploadCommand) FileUpload(sum string) error {
|
|||||||
|
|
||||||
func (c *UploadCommand) Execute(args []string) error {
|
func (c *UploadCommand) Execute(args []string) error {
|
||||||
cli := c.Cli()
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err, ok := resp.Error().(*UploadError); ok {
|
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)
|
return errors.New(err.Error)
|
||||||
}
|
}
|
||||||
|
|
||||||
result := resp.Result().(*UploadCreate)
|
uploadId := resp.Result().(*UploadCreate).UploadId
|
||||||
fmt.Printf("Upload create: %s", result.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
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user