Skip to content

Commit 5e3dc8d

Browse files
author
cyk
committed
fix(driver): improve MD5 calculation using chunked range reads
1 parent 15eac0c commit 5e3dc8d

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

drivers/123_open/driver.go

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import (
44
"context"
55
"encoding/hex"
66
"fmt"
7+
"io"
78
"strconv"
89
"time"
910

1011
"github.com/OpenListTeam/OpenList/v4/internal/driver"
1112
"github.com/OpenListTeam/OpenList/v4/internal/errs"
1213
"github.com/OpenListTeam/OpenList/v4/internal/model"
1314
"github.com/OpenListTeam/OpenList/v4/internal/op"
15+
"github.com/OpenListTeam/OpenList/v4/pkg/http_range"
1416
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
1517
)
1618

@@ -156,19 +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,流式计算hash
167+
168+
// 1. 流式计算MD5
166169
md5Hash := utils.MD5.NewFunc()
167-
_, err = file.CacheFullAndWriter(&up, md5Hash)
168-
if err != nil {
169-
return nil, err
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})
176+
if err != nil {
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)
181+
}
182+
offset += readSize
183+
184+
progress := 40 * float64(offset) / float64(size)
185+
up(progress)
170186
}
187+
171188
etag := hex.EncodeToString(md5Hash.Sum(nil))
189+
190+
// 2. 创建上传任务
172191
createResp, err := d.create(parentFileId, file.GetName(), etag, file.GetSize(), 2, false)
173192
if err != nil {
174193
return nil, err
@@ -187,13 +206,16 @@ func (d *Open123) Put(ctx context.Context, dstDir model.Obj, file model.FileStre
187206
}
188207
}
189208

190-
// 2. 上传分片
191-
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)
192214
if err != nil {
193215
return nil, err
194216
}
195217

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

0 commit comments

Comments
 (0)