Compare commits

...

2 Commits

Author SHA1 Message Date
celogeek
2078373889
cli to upload part 2022-05-13 23:56:09 +02:00
celogeek
b37890a9e6
named upload route 2022-05-13 23:56:00 +02:00
2 changed files with 68 additions and 10 deletions

View File

@ -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
} }

View File

@ -145,13 +145,12 @@ func (s *Service) UploadComplete(c *gin.Context) {
func (s *Service) UploadInit() { func (s *Service) UploadInit() {
upload := s.Gin.Group("/upload") upload := s.Gin.Group("/upload")
// upload.GET("/create", s.UploadCreate) // start
// upload.POST("/part/:upload_id", s.UploadPart)
// upload.GET("/cancel/:upload_id", s.UploadCancel)
// upload.POST("/complete/:upload_id", s.UploadComplete)
upload.POST("", s.UploadCreate) upload.POST("", s.UploadCreate)
// Cancel
upload.DELETE("/:upload_id", s.UploadCancel) upload.DELETE("/:upload_id", s.UploadCancel)
// Add part
upload.PUT("/:upload_id", s.UploadPart) upload.PUT("/:upload_id", s.UploadPart)
// Complete
upload.POST("/:upload_id", s.UploadComplete) upload.POST("/:upload_id", s.UploadComplete)
} }