@@ -2,15 +2,17 @@ package _123_open
22
33import (
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
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
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