mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
fix: progressively update image size while uploading
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)))
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user