@@ -2,17 +2,21 @@ package _115
2
2
3
3
import (
4
4
"bytes"
5
+ "context"
5
6
"crypto/md5"
6
7
"crypto/tls"
7
8
"encoding/hex"
8
9
"encoding/json"
9
10
"fmt"
11
+ "github.com/alist-org/alist/v3/internal/driver"
12
+ "github.com/alist-org/alist/v3/internal/stream"
10
13
"io"
11
14
"net/http"
12
15
"net/url"
13
16
"strconv"
14
17
"strings"
15
18
"sync"
19
+ "sync/atomic"
16
20
"time"
17
21
18
22
"github.com/alist-org/alist/v3/internal/conf"
@@ -271,7 +275,7 @@ func UploadDigestRange(stream model.FileStreamer, rangeSpec string) (result stri
271
275
}
272
276
273
277
// UploadByOSS use aliyun sdk to upload
274
- func (c * Pan115 ) UploadByOSS (params * driver115.UploadOSSParams , r io. Reader , dirID string ) (* UploadResult , error ) {
278
+ func (c * Pan115 ) UploadByOSS (ctx context. Context , params * driver115.UploadOSSParams , s model. FileStreamer , dirID string , up driver. UpdateProgress ) (* UploadResult , error ) {
275
279
ossToken , err := c .client .GetOSSToken ()
276
280
if err != nil {
277
281
return nil , err
@@ -286,6 +290,13 @@ func (c *Pan115) UploadByOSS(params *driver115.UploadOSSParams, r io.Reader, dir
286
290
}
287
291
288
292
var bodyBytes []byte
293
+ r := & stream.ReaderWithCtx {
294
+ Reader : & stream.ReaderUpdatingProgress {
295
+ Reader : s ,
296
+ UpdateProgress : up ,
297
+ },
298
+ Ctx : ctx ,
299
+ }
289
300
if err = bucket .PutObject (params .Object , r , append (
290
301
driver115 .OssOption (params , ossToken ),
291
302
oss .CallbackResult (& bodyBytes ),
@@ -301,7 +312,8 @@ func (c *Pan115) UploadByOSS(params *driver115.UploadOSSParams, r io.Reader, dir
301
312
}
302
313
303
314
// UploadByMultipart upload by mutipart blocks
304
- func (d * Pan115 ) UploadByMultipart (params * driver115.UploadOSSParams , fileSize int64 , stream model.FileStreamer , dirID string , opts ... driver115.UploadMultipartOption ) (* UploadResult , error ) {
315
+ func (d * Pan115 ) UploadByMultipart (ctx context.Context , params * driver115.UploadOSSParams , fileSize int64 , s model.FileStreamer ,
316
+ dirID string , up driver.UpdateProgress , opts ... driver115.UploadMultipartOption ) (* UploadResult , error ) {
305
317
var (
306
318
chunks []oss.FileChunk
307
319
parts []oss.UploadPart
@@ -313,7 +325,7 @@ func (d *Pan115) UploadByMultipart(params *driver115.UploadOSSParams, fileSize i
313
325
err error
314
326
)
315
327
316
- tmpF , err := stream .CacheFullInTempFile ()
328
+ tmpF , err := s .CacheFullInTempFile ()
317
329
if err != nil {
318
330
return nil , err
319
331
}
@@ -372,6 +384,7 @@ func (d *Pan115) UploadByMultipart(params *driver115.UploadOSSParams, fileSize i
372
384
quit <- struct {}{}
373
385
}()
374
386
387
+ completedNum := atomic.Int32 {}
375
388
// consumers
376
389
for i := 0 ; i < options .ThreadsNum ; i ++ {
377
390
go func (threadId int ) {
@@ -384,6 +397,8 @@ func (d *Pan115) UploadByMultipart(params *driver115.UploadOSSParams, fileSize i
384
397
var part oss.UploadPart // 出现错误就继续尝试,共尝试3次
385
398
for retry := 0 ; retry < 3 ; retry ++ {
386
399
select {
400
+ case <- ctx .Done ():
401
+ break
387
402
case <- ticker .C :
388
403
if ossToken , err = d .client .GetOSSToken (); err != nil { // 到时重新获取ossToken
389
404
errCh <- errors .Wrap (err , "刷新token时出现错误" )
@@ -396,12 +411,18 @@ func (d *Pan115) UploadByMultipart(params *driver115.UploadOSSParams, fileSize i
396
411
continue
397
412
}
398
413
399
- if part , err = bucket .UploadPart (imur , bytes .NewBuffer (buf ), chunk .Size , chunk .Number , driver115 .OssOption (params , ossToken )... ); err == nil {
414
+ if part , err = bucket .UploadPart (imur , & stream.ReaderWithCtx {
415
+ Reader : bytes .NewBuffer (buf ),
416
+ Ctx : ctx ,
417
+ }, chunk .Size , chunk .Number , driver115 .OssOption (params , ossToken )... ); err == nil {
400
418
break
401
419
}
402
420
}
403
421
if err != nil {
404
- errCh <- errors .Wrap (err , fmt .Sprintf ("上传 %s 的第%d个分片时出现错误:%v" , stream .GetName (), chunk .Number , err ))
422
+ errCh <- errors .Wrap (err , fmt .Sprintf ("上传 %s 的第%d个分片时出现错误:%v" , s .GetName (), chunk .Number , err ))
423
+ } else {
424
+ num := completedNum .Add (1 )
425
+ up (float64 (num ) * 100.0 / float64 (len (chunks )))
405
426
}
406
427
UploadedPartsCh <- part
407
428
}
0 commit comments