@@ -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
158160func (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