@@ -10,7 +10,6 @@ import (
10
10
"io"
11
11
"net/http"
12
12
"net/url"
13
- "path/filepath"
14
13
"strconv"
15
14
"strings"
16
15
"sync"
@@ -254,6 +253,7 @@ func (d *Pan115) UploadByMultipart(params *driver115.UploadOSSParams, fileSize i
254
253
ossClient * oss.Client
255
254
bucket * oss.Bucket
256
255
ossToken * driver115.UploadOSSTokenResp
256
+ bodyBytes []byte
257
257
err error
258
258
)
259
259
@@ -268,12 +268,14 @@ func (d *Pan115) UploadByMultipart(params *driver115.UploadOSSParams, fileSize i
268
268
f (options )
269
269
}
270
270
}
271
+ // oss 启用Sequential必须按顺序上传
272
+ options .ThreadsNum = 1
271
273
272
274
if ossToken , err = d .client .GetOSSToken (); err != nil {
273
275
return err
274
276
}
275
277
276
- if ossClient , err = oss .New (driver115 .OSSEndpoint , ossToken .AccessKeyID , ossToken .AccessKeySecret ); err != nil {
278
+ if ossClient , err = oss .New (driver115 .OSSEndpoint , ossToken .AccessKeyID , ossToken .AccessKeySecret , oss . EnableMD5 ( true ), oss . EnableCRC ( true ) ); err != nil {
277
279
return err
278
280
}
279
281
@@ -294,6 +296,7 @@ func (d *Pan115) UploadByMultipart(params *driver115.UploadOSSParams, fileSize i
294
296
if imur , err = bucket .InitiateMultipartUpload (params .Object ,
295
297
oss .SetHeader (driver115 .OssSecurityTokenHeaderName , ossToken .SecurityToken ),
296
298
oss .UserAgentHeader (driver115 .OSSUserAgent ),
299
+ oss .EnableSha1 (), oss .Sequential (),
297
300
); err != nil {
298
301
return err
299
302
}
@@ -337,8 +340,7 @@ func (d *Pan115) UploadByMultipart(params *driver115.UploadOSSParams, fileSize i
337
340
continue
338
341
}
339
342
340
- b := bytes .NewBuffer (buf )
341
- if part , err = bucket .UploadPart (imur , b , chunk .Size , chunk .Number , driver115 .OssOption (params , ossToken )... ); err == nil {
343
+ if part , err = bucket .UploadPart (imur , bytes .NewBuffer (buf ), chunk .Size , chunk .Number , driver115 .OssOption (params , ossToken )... ); err == nil {
342
344
break
343
345
}
344
346
}
@@ -373,14 +375,20 @@ LOOP:
373
375
}
374
376
}
375
377
376
- // EOF错误是xml的Unmarshal导致的,响应其实是json格式,所以实际上上传是成功的
377
- if _ , err = bucket .CompleteMultipartUpload (imur , parts , driver115 .OssOption (params , ossToken )... ); err != nil && ! errors .Is (err , io .EOF ) {
378
- // 当文件名含有 &< 这两个字符之一时响应的xml解析会出现错误,实际上上传是成功的
379
- if filename := filepath .Base (stream .GetName ()); ! strings .ContainsAny (filename , "&<" ) {
380
- return err
381
- }
378
+ // 不知道啥原因,oss那边分片上传不计算sha1,导致115服务器校验错误
379
+ // params.Callback.Callback = strings.ReplaceAll(params.Callback.Callback, "${sha1}", params.SHA1)
380
+ if _ , err := bucket .CompleteMultipartUpload (imur , parts , append (
381
+ driver115 .OssOption (params , ossToken ),
382
+ oss .CallbackResult (& bodyBytes ),
383
+ )... ); err != nil {
384
+ return err
382
385
}
383
- return d .checkUploadStatus (dirID , params .SHA1 )
386
+
387
+ var uploadResult UploadResult
388
+ if err = json .Unmarshal (bodyBytes , & uploadResult ); err != nil {
389
+ return err
390
+ }
391
+ return uploadResult .Err (string (bodyBytes ))
384
392
}
385
393
386
394
func chunksProducer (ch chan oss.FileChunk , chunks []oss.FileChunk ) {
@@ -389,27 +397,6 @@ func chunksProducer(ch chan oss.FileChunk, chunks []oss.FileChunk) {
389
397
}
390
398
}
391
399
392
- func (d * Pan115 ) checkUploadStatus (dirID , sha1 string ) error {
393
- // 验证上传是否成功
394
- req := d .client .NewRequest ().ForceContentType ("application/json;charset=UTF-8" )
395
- opts := []driver115.GetFileOptions {
396
- driver115 .WithOrder (driver115 .FileOrderByTime ),
397
- driver115 .WithShowDirEnable (false ),
398
- driver115 .WithAsc (false ),
399
- driver115 .WithLimit (500 ),
400
- }
401
- fResp , err := driver115 .GetFiles (req , dirID , opts ... )
402
- if err != nil {
403
- return err
404
- }
405
- for _ , fileInfo := range fResp .Files {
406
- if fileInfo .Sha1 == sha1 {
407
- return nil
408
- }
409
- }
410
- return driver115 .ErrUploadFailed
411
- }
412
-
413
400
func SplitFile (fileSize int64 ) (chunks []oss.FileChunk , err error ) {
414
401
for i := int64 (1 ); i < 10 ; i ++ {
415
402
if fileSize < i * utils .GB { // 文件大小小于iGB时分为i*1000片
0 commit comments