Skip to content

Commit 7fca85e

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

File tree

1 file changed

+32
-8
lines changed

1 file changed

+32
-8
lines changed

drivers/123_open/driver.go

Lines changed: 32 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,38 @@ 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+
// 流式计算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+
172+
// 使用RangeRead分块读取并计算MD5,进度0-40%
173+
chunkSize := int64(10 * 1024 * 1024) // 10MB per chunk for MD5 calculation
174+
var offset int64 = 0
175+
for offset < size {
176+
readSize := min(chunkSize, size-offset)
177+
reader, err := file.RangeRead(http_range.Range{Start: offset, Length: readSize})
178+
if err != nil {
179+
return nil, fmt.Errorf("range read for MD5 calculation failed: %w", err)
180+
}
181+
if _, err := io.Copy(md5Hash, reader); err != nil {
182+
return nil, fmt.Errorf("calculate MD5 failed: %w", err)
183+
}
184+
offset += readSize
185+
186+
progress := 40 * float64(offset) / float64(size)
187+
up(progress)
170188
}
189+
171190
etag := hex.EncodeToString(md5Hash.Sum(nil))
191+
192+
// 2. 创建上传任务
172193
createResp, err := d.create(parentFileId, file.GetName(), etag, file.GetSize(), 2, false)
173194
if err != nil {
174195
return nil, err
@@ -187,13 +208,16 @@ func (d *Open123) Put(ctx context.Context, dstDir model.Obj, file model.FileStre
187208
}
188209
}
189210

190-
// 2. 上传分片
191-
err = d.Upload(ctx, file, createResp, up)
211+
// 上传分片
212+
uploadProgress := func(p float64) {
213+
up(40 + p*0.6)
214+
}
215+
err = d.Upload(ctx, file, createResp, uploadProgress)
192216
if err != nil {
193217
return nil, err
194218
}
195219

196-
// 3. 上传完毕
220+
// 4. 上传完毕
197221
for range 60 {
198222
uploadCompleteResp, err := d.complete(createResp.Data.PreuploadID)
199223
// 返回错误代码未知,如:20103,文档也没有具体说

0 commit comments

Comments
 (0)