From f09bb88846c042999703d96725f7fa725a74c2fe Mon Sep 17 00:00:00 2001 From: foxxorcat <95907542+foxxorcat@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:21:30 +0800 Subject: [PATCH] fix(thunder): upload issues (close #4663 in #4667) --- drivers/thunder/driver.go | 25 ++++++++++++++++++++++--- drivers/thunder/util.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/drivers/thunder/driver.go b/drivers/thunder/driver.go index 12dd8904..30025b59 100644 --- a/drivers/thunder/driver.go +++ b/drivers/thunder/driver.go @@ -3,7 +3,9 @@ package thunder import ( "context" "fmt" + "io" "net/http" + "os" "strings" "github.com/alist-org/alist/v3/drivers/base" @@ -331,15 +333,32 @@ func (xc *XunLeiCommon) Remove(ctx context.Context, obj model.Obj) error { } func (xc *XunLeiCommon) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error { + tempFile, err := utils.CreateTempFile(stream.GetReadCloser()) + if err != nil { + return err + } + defer func() { + _ = tempFile.Close() + _ = os.Remove(tempFile.Name()) + }() + + gcid, err := getGcid(tempFile, stream.GetSize()) + if err != nil { + return err + } + if _, err := tempFile.Seek(0, io.SeekStart); err != nil { + return err + } + var resp UploadTaskResponse - _, err := xc.Request(FILE_API_URL, http.MethodPost, func(r *resty.Request) { + _, err = xc.Request(FILE_API_URL, http.MethodPost, func(r *resty.Request) { r.SetContext(ctx) r.SetBody(&base.Json{ "kind": FILE, "parent_id": dstDir.GetID(), "name": stream.GetName(), "size": stream.GetSize(), - "hash": "1CF254FBC456E1B012CD45C546636AA62CF8350E", + "hash": gcid, "upload_type": UPLOAD_TYPE_RESUMABLE, }) }, &resp) @@ -362,7 +381,7 @@ func (xc *XunLeiCommon) Put(ctx context.Context, dstDir model.Obj, stream model. Bucket: aws.String(param.Bucket), Key: aws.String(param.Key), Expires: aws.Time(param.Expiration), - Body: stream, + Body: tempFile, }) return err } diff --git a/drivers/thunder/util.go b/drivers/thunder/util.go index 5c8ed3b8..fe4c3c97 100644 --- a/drivers/thunder/util.go +++ b/drivers/thunder/util.go @@ -1,7 +1,10 @@ package thunder import ( + "crypto/sha1" + "encoding/hex" "fmt" + "io" "net/http" "regexp" "time" @@ -171,3 +174,29 @@ func (c *Common) Request(url, method string, callback base.ReqCallback, resp int return res.Body(), nil } + +// 计算文件Gcid +func getGcid(r io.Reader, size int64) (string, error) { + calcBlockSize := func(j int64) int64 { + var psize int64 = 0x40000 + for float64(j)/float64(psize) > 0x200 && psize < 0x200000 { + psize = psize << 1 + } + return psize + } + + hash1 := sha1.New() + hash2 := sha1.New() + readSize := calcBlockSize(size) + for { + hash2.Reset() + if n, err := io.CopyN(hash2, r, readSize); err != nil && n == 0 { + if err != io.EOF { + return "", err + } + break + } + hash1.Write(hash2.Sum(nil)) + } + return hex.EncodeToString(hash1.Sum(nil)), nil +}