Skip to content

Commit 8e29c2a

Browse files
authored
Merge pull request #1 from Ironboxplus/fix
Fix
2 parents 6e2d499 + 4e74fc2 commit 8e29c2a

File tree

1 file changed

+31
-10
lines changed

1 file changed

+31
-10
lines changed

drivers/123_open/driver.go

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@ package _123_open
22

33
import (
44
"context"
5+
"encoding/hex"
56
"fmt"
7+
"io"
68
"strconv"
79
"time"
810

911
"github.com/OpenListTeam/OpenList/v4/internal/driver"
1012
"github.com/OpenListTeam/OpenList/v4/internal/errs"
1113
"github.com/OpenListTeam/OpenList/v4/internal/model"
1214
"github.com/OpenListTeam/OpenList/v4/internal/op"
13-
"github.com/OpenListTeam/OpenList/v4/internal/stream"
15+
"github.com/OpenListTeam/OpenList/v4/pkg/http_range"
1416
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
1517
)
1618

@@ -156,20 +158,36 @@ func (d *Open123) Remove(ctx context.Context, obj model.Obj) error {
156158
}
157159

158160
func (d *Open123) Put(ctx context.Context, dstDir model.Obj, file model.FileStreamer, up driver.UpdateProgress) (model.Obj, error) {
159-
// 1. 创建文件
161+
// 1. 准备参数
160162
// parentFileID 父目录id,上传到根目录时填写 0
161163
parentFileId, err := strconv.ParseInt(dstDir.GetID(), 10, 64)
162164
if err != nil {
163165
return nil, fmt.Errorf("parse parentFileID error: %v", err)
164166
}
165-
// etag 文件md5
166-
etag := file.GetHash().GetHash(utils.MD5)
167-
if len(etag) < utils.MD5.Width {
168-
_, etag, err = stream.CacheFullAndHash(file, &up, utils.MD5)
167+
168+
// 1. 流式计算MD5
169+
md5Hash := utils.MD5.NewFunc()
170+
size := file.GetSize()
171+
chunkSize := int64(10 * 1024 * 1024) // 10MB per chunk for MD5 calculation
172+
var offset int64 = 0
173+
for offset < size {
174+
readSize := min(chunkSize, size-offset)
175+
reader, err := file.RangeRead(http_range.Range{Start: offset, Length: readSize})
169176
if err != nil {
170-
return nil, err
177+
return nil, fmt.Errorf("range read for MD5 calculation failed: %w", err)
178+
}
179+
if _, err := io.Copy(md5Hash, reader); err != nil {
180+
return nil, fmt.Errorf("calculate MD5 failed: %w", err)
171181
}
182+
offset += readSize
183+
184+
progress := 40 * float64(offset) / float64(size)
185+
up(progress)
172186
}
187+
188+
etag := hex.EncodeToString(md5Hash.Sum(nil))
189+
190+
// 2. 创建上传任务
173191
createResp, err := d.create(parentFileId, file.GetName(), etag, file.GetSize(), 2, false)
174192
if err != nil {
175193
return nil, err
@@ -188,13 +206,16 @@ func (d *Open123) Put(ctx context.Context, dstDir model.Obj, file model.FileStre
188206
}
189207
}
190208

191-
// 2. 上传分片
192-
err = d.Upload(ctx, file, createResp, up)
209+
// 3. 上传分片
210+
uploadProgress := func(p float64) {
211+
up(40 + p*0.6)
212+
}
213+
err = d.Upload(ctx, file, createResp, uploadProgress)
193214
if err != nil {
194215
return nil, err
195216
}
196217

197-
// 3. 上传完毕
218+
// 4. 合并分片/完成上传
198219
for range 60 {
199220
uploadCompleteResp, err := d.complete(createResp.Data.PreuploadID)
200221
// 返回错误代码未知,如:20103,文档也没有具体说

0 commit comments

Comments
 (0)