@@ -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
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+ // 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