@@ -265,27 +265,12 @@ func (d *BaiduNetdisk) Put(ctx context.Context, dstDir model.Obj, stream model.F
265
265
precreateResp , ok := base .GetUploadProgress [* PrecreateResp ](d , d .AccessToken , contentMd5 )
266
266
if ! ok {
267
267
// 没有进度,走预上传
268
- params := map [string ]string {"method" : "precreate" }
269
- form := map [string ]string {
270
- "path" : path ,
271
- "size" : strconv .FormatInt (streamSize , 10 ),
272
- "isdir" : "0" ,
273
- "autoinit" : "1" ,
274
- "rtype" : "3" ,
275
- "block_list" : blockListStr ,
276
- "content-md5" : contentMd5 ,
277
- "slice-md5" : sliceMd5 ,
278
- }
279
- joinTime (form , ctime , mtime )
280
- _ , err = d .postForm ("/xpan/file" , params , form , & precreateResp )
268
+ precreateResp , err = d .precreate (ctx , path , streamSize , blockListStr , contentMd5 , sliceMd5 , ctime , mtime )
281
269
if err != nil {
282
270
return nil , err
283
271
}
284
272
if precreateResp .ReturnType == 2 {
285
273
//rapid upload, since got md5 match from baidu server
286
- // 修复时间,具体原因见 Put 方法注释的 **注意**
287
- precreateResp .File .Ctime = ctime
288
- precreateResp .File .Mtime = mtime
289
274
return fileToObj (precreateResp .File ), nil
290
275
}
291
276
}
@@ -353,27 +338,14 @@ uploadLoop:
353
338
if errors .Is (err , ErrUploadIDExpired ) {
354
339
log .Warn ("[baidu_netdisk] uploadid expired, will restart from scratch" )
355
340
// 重新 precreate(所有分片都要重传)
356
- params := map [string ]string {"method" : "precreate" }
357
- form := map [string ]string {
358
- "path" : path ,
359
- "size" : strconv .FormatInt (streamSize , 10 ),
360
- "isdir" : "0" ,
361
- "autoinit" : "1" ,
362
- "rtype" : "3" ,
363
- "block_list" : blockListStr ,
364
- }
365
- joinTime (form , ctime , mtime )
366
- var newPre PrecreateResp
367
- _ , err2 := d .postForm ("/xpan/file" , params , form , & newPre )
341
+ newPre , err2 := d .precreate (ctx , path , streamSize , blockListStr , "" , "" , ctime , mtime )
368
342
if err2 != nil {
369
343
return nil , err2
370
344
}
371
345
if newPre .ReturnType == 2 {
372
- newPre .File .Ctime = ctime
373
- newPre .File .Mtime = mtime
374
346
return fileToObj (newPre .File ), nil
375
347
}
376
- precreateResp = & newPre
348
+ precreateResp = newPre
377
349
// 覆盖掉旧的进度
378
350
base .SaveUploadProgress (d , precreateResp , d .AccessToken , contentMd5 )
379
351
continue uploadLoop
@@ -395,6 +367,41 @@ uploadLoop:
395
367
return fileToObj (newFile ), nil
396
368
}
397
369
370
+ // precreate 执行预上传操作,支持首次上传和 uploadid 过期重试
371
+ func (d * BaiduNetdisk ) precreate (ctx context.Context , path string , streamSize int64 , blockListStr , contentMd5 , sliceMd5 string , ctime , mtime int64 ) (* PrecreateResp , error ) {
372
+ params := map [string ]string {"method" : "precreate" }
373
+ form := map [string ]string {
374
+ "path" : path ,
375
+ "size" : strconv .FormatInt (streamSize , 10 ),
376
+ "isdir" : "0" ,
377
+ "autoinit" : "1" ,
378
+ "rtype" : "3" ,
379
+ "block_list" : blockListStr ,
380
+ }
381
+
382
+ // 只有在首次上传时才包含 content-md5 和 slice-md5
383
+ if contentMd5 != "" && sliceMd5 != "" {
384
+ form ["content-md5" ] = contentMd5
385
+ form ["slice-md5" ] = sliceMd5
386
+ }
387
+
388
+ joinTime (form , ctime , mtime )
389
+
390
+ var precreateResp PrecreateResp
391
+ _ , err := d .postForm ("/xpan/file" , params , form , & precreateResp )
392
+ if err != nil {
393
+ return nil , err
394
+ }
395
+
396
+ // 修复时间,具体原因见 Put 方法注释的 **注意**
397
+ if precreateResp .ReturnType == 2 {
398
+ precreateResp .File .Ctime = ctime
399
+ precreateResp .File .Mtime = mtime
400
+ }
401
+
402
+ return & precreateResp , nil
403
+ }
404
+
398
405
func (d * BaiduNetdisk ) uploadSlice (ctx context.Context , params map [string ]string , fileName string , file io.Reader ) error {
399
406
res , err := base .RestyClient .R ().
400
407
SetContext (ctx ).
@@ -409,7 +416,7 @@ func (d *BaiduNetdisk) uploadSlice(ctx context.Context, params map[string]string
409
416
errNo := utils .Json .Get (res .Body (), "errno" ).ToInt ()
410
417
respStr := res .String ()
411
418
lower := strings .ToLower (respStr )
412
- // 合并 uploadid 过期检测逻辑
419
+ // 合并 uploadid 过期检测逻辑
413
420
if strings .Contains (lower , "uploadid" ) &&
414
421
(strings .Contains (lower , "invalid" ) || strings .Contains (lower , "expired" ) || strings .Contains (lower , "not found" )) {
415
422
return ErrUploadIDExpired
@@ -430,4 +437,3 @@ func (d *BaiduNetdisk) GetDetails(ctx context.Context) (*model.StorageDetails, e
430
437
}
431
438
432
439
var _ driver.Driver = (* BaiduNetdisk )(nil )
433
-
0 commit comments