fix: progressively update image size while uploading

This commit is contained in:
Qiu Jian
2020-02-10 09:29:37 +08:00
parent 8701c6172e
commit 60ba83b40f
5 changed files with 27 additions and 6 deletions
+20 -2
View File
@@ -244,7 +244,7 @@ func (self *SImage) CustomizedGetDetailsBody(ctx context.Context, userCred mccli
}
defer fp.Close()
_, err = streamutils.StreamPipe(fp, appParams.Response, false)
_, err = streamutils.StreamPipe(fp, appParams.Response, false, nil)
if err != nil {
return nil, httperrors.NewGeneralError(err)
}
@@ -448,7 +448,25 @@ func (self *SImage) saveImageFromStream(localPath string, reader io.Reader, calC
return nil, err
}
defer fp.Close()
return streamutils.StreamPipe(reader, fp, calChecksum)
lastSaveTime := time.Now()
return streamutils.StreamPipe(reader, fp, calChecksum, func(saved int64) {
now := time.Now()
if now.Sub(lastSaveTime) > 5*time.Second {
self.saveSize(saved)
lastSaveTime = now
}
})
}
func (self *SImage) saveSize(newSize int64) error {
_, err := db.Update(self, func() error {
self.Size = newSize
return nil
})
if err != nil {
return errors.Wrap(err, "Update size")
}
return nil
}
//Image always do probe and customize after save from stream
+1 -1
View File
@@ -121,7 +121,7 @@ func init() {
} else {
fio = os.Stdout
}
prop, err := streamutils.StreamPipe(output.Body, fio, true)
prop, err := streamutils.StreamPipe(output.Body, fio, true, nil)
if err != nil {
return err
}
+1 -1
View File
@@ -416,7 +416,7 @@ func S3Shell() {
defer fp.Close()
target = fp
}
prop, err := streamutils.StreamPipe(output, target, false)
prop, err := streamutils.StreamPipe(output, target, false, nil)
if err != nil {
return err
}
+1 -1
View File
@@ -306,7 +306,7 @@ func SignV4(req http.Request, accessKey, secretAccessKey, location string, body
h := sha256.New()
if body != nil {
streamutils.StreamPipe(body, h, false)
streamutils.StreamPipe(body, h, false, nil)
}
req.Header.Set("X-Amz-Content-Sha256", hex.EncodeToString(h.Sum(nil)))
+4 -1
View File
@@ -26,7 +26,7 @@ type SStreamProperty struct {
Size int64
}
func StreamPipe(reader io.Reader, writer io.Writer, CalChecksum bool) (*SStreamProperty, error) {
func StreamPipe(reader io.Reader, writer io.Writer, CalChecksum bool, callback func(saved int64)) (*SStreamProperty, error) {
sp := SStreamProperty{}
var md5sum hash.Hash
@@ -50,6 +50,9 @@ func StreamPipe(reader io.Reader, writer io.Writer, CalChecksum bool) (*SStreamP
}
offset += m
}
if callback != nil {
callback(sp.Size)
}
}
if err != nil {
if err == io.EOF {