Skip to content

Commit e270f16

Browse files
committed
add precreate function
1 parent 422142c commit e270f16

File tree

1 file changed

+39
-33
lines changed

1 file changed

+39
-33
lines changed

drivers/baidu_netdisk/driver.go

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -265,27 +265,12 @@ func (d *BaiduNetdisk) Put(ctx context.Context, dstDir model.Obj, stream model.F
265265
precreateResp, ok := base.GetUploadProgress[*PrecreateResp](d, d.AccessToken, contentMd5)
266266
if !ok {
267267
// 没有进度,走预上传
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)
281269
if err != nil {
282270
return nil, err
283271
}
284272
if precreateResp.ReturnType == 2 {
285273
//rapid upload, since got md5 match from baidu server
286-
// 修复时间,具体原因见 Put 方法注释的 **注意**
287-
precreateResp.File.Ctime = ctime
288-
precreateResp.File.Mtime = mtime
289274
return fileToObj(precreateResp.File), nil
290275
}
291276
}
@@ -353,27 +338,14 @@ uploadLoop:
353338
if errors.Is(err, ErrUploadIDExpired) {
354339
log.Warn("[baidu_netdisk] uploadid expired, will restart from scratch")
355340
// 重新 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)
368342
if err2 != nil {
369343
return nil, err2
370344
}
371345
if newPre.ReturnType == 2 {
372-
newPre.File.Ctime = ctime
373-
newPre.File.Mtime = mtime
374346
return fileToObj(newPre.File), nil
375347
}
376-
precreateResp = &newPre
348+
precreateResp = newPre
377349
// 覆盖掉旧的进度
378350
base.SaveUploadProgress(d, precreateResp, d.AccessToken, contentMd5)
379351
continue uploadLoop
@@ -395,6 +367,41 @@ uploadLoop:
395367
return fileToObj(newFile), nil
396368
}
397369

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+
398405
func (d *BaiduNetdisk) uploadSlice(ctx context.Context, params map[string]string, fileName string, file io.Reader) error {
399406
res, err := base.RestyClient.R().
400407
SetContext(ctx).
@@ -409,7 +416,7 @@ func (d *BaiduNetdisk) uploadSlice(ctx context.Context, params map[string]string
409416
errNo := utils.Json.Get(res.Body(), "errno").ToInt()
410417
respStr := res.String()
411418
lower := strings.ToLower(respStr)
412-
// 合并 uploadid 过期检测逻辑
419+
// 合并 uploadid 过期检测逻辑
413420
if strings.Contains(lower, "uploadid") &&
414421
(strings.Contains(lower, "invalid") || strings.Contains(lower, "expired") || strings.Contains(lower, "not found")) {
415422
return ErrUploadIDExpired
@@ -430,4 +437,3 @@ func (d *BaiduNetdisk) GetDetails(ctx context.Context) (*model.StorageDetails, e
430437
}
431438

432439
var _ driver.Driver = (*BaiduNetdisk)(nil)
433-

0 commit comments

Comments
 (0)