Skip to content
47 changes: 47 additions & 0 deletions drivers/115/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -258,4 +258,51 @@ func (d *Pan115) GetDetails(ctx context.Context) (*model.StorageDetails, error)
}, nil
}

func (d *Pan115) BatchMove(ctx context.Context, srcDir model.Obj, srcObjs []model.Obj, dstDir model.Obj, args model.BatchArgs) error {
if err := d.WaitLimit(ctx); err != nil {
return err
}

var srcObjIds []string
for _, srcObj := range srcObjs {
srcObjIds = append(srcObjIds, srcObj.GetID())
}

return d.client.Move(dstDir.GetID(), srcObjIds...)
}

func (d *Pan115) BatchCopy(ctx context.Context, srcDir model.Obj, srcObjs []model.Obj, dstDir model.Obj, args model.BatchArgs) error {
if err := d.WaitLimit(ctx); err != nil {
return err
}

var srcObjIds []string
for _, srcObj := range srcObjs {
srcObjIds = append(srcObjIds, srcObj.GetID())
}

return d.client.Copy(dstDir.GetID(), srcObjIds...)
}

func (d *Pan115) BatchRemove(ctx context.Context, batchRemoveObj model.BatchRemoveObj, args model.BatchArgs) error {
if err := d.WaitLimit(ctx); err != nil {
return err
}

var srcObjIds []string
for _, srcObj := range batchRemoveObj.RemoveObjs {
srcObjIds = append(srcObjIds, srcObj.GetID())
}

return d.client.Delete(srcObjIds...)
}

func (d *Pan115) BatchRename(ctx context.Context, batchRenameObj model.BatchRenameObj, args model.BatchArgs) error {
if err := d.WaitLimit(ctx); err != nil {
return err
}

return d.batchRename(batchRenameObj)
}

var _ driver.Driver = (*Pan115)(nil)
20 changes: 20 additions & 0 deletions drivers/115/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -547,3 +547,23 @@ func SplitFileByPartSize(fileSize int64, chunkSize int64) ([]oss.FileChunk, erro

return chunks, nil
}

func (d *Pan115) batchRename(renameObj model.BatchRenameObj) error {

form := make(map[string]string)

for _, obj := range renameObj.RenameObjs {
form[fmt.Sprintf("files_new_name[%s]", obj.GetID())] = obj.NewName
}

result := driver115.BasicResp{}

req := d.client.NewRequest().
SetFormData(form).
ForceContentType("application/json;charset=UTF-8").
SetResult(&result)

resp, err := req.Post(driver115.ApiFileRename)

return driver115.CheckErr(err, &result, resp)
}
53 changes: 53 additions & 0 deletions drivers/115_open/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -367,4 +367,57 @@ func (d *Open115) GetDetails(ctx context.Context) (*model.StorageDetails, error)
// return nil, errs.NotSupport
//}

func (d *Open115) BatchMove(ctx context.Context, srcDir model.Obj, srcObjs []model.Obj, dstDir model.Obj, args model.BatchArgs) error {
if err := d.WaitLimit(ctx); err != nil {
return err
}

var srcObjIds []string
for _, srcObj := range srcObjs {
srcObjIds = append(srcObjIds, srcObj.GetID())
}

_, err := d.client.Move(ctx, &sdk.MoveReq{
FileIDs: strings.Join(srcObjIds, ","),
ToCid: dstDir.GetID(),
})
return err
}

func (d *Open115) BatchCopy(ctx context.Context, srcDir model.Obj, srcObjs []model.Obj, dstDir model.Obj, args model.BatchArgs) error {
if err := d.WaitLimit(ctx); err != nil {
return err
}

var srcObjIds []string
for _, srcObj := range srcObjs {
srcObjIds = append(srcObjIds, srcObj.GetID())
}

_, err := d.client.Copy(ctx, &sdk.CopyReq{
PID: dstDir.GetID(),
FileID: strings.Join(srcObjIds, ","),
NoDupli: "1",
})
return err
}

func (d *Open115) BatchRemove(ctx context.Context, batchRemoveObj model.BatchRemoveObj, args model.BatchArgs) error {
if err := d.WaitLimit(ctx); err != nil {
return err
}

var srcObjIds []string
for _, srcObj := range batchRemoveObj.RemoveObjs {
srcObjIds = append(srcObjIds, srcObj.GetID())
}

_, err := d.client.DelFile(ctx, &sdk.DelFileReq{
FileIDs: strings.Join(srcObjIds, ","),
ParentID: batchRemoveObj.Dir.GetID(),
})

return err
}

var _ driver.Driver = (*Open115)(nil)
30 changes: 28 additions & 2 deletions drivers/123_open/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ func (d *Open123) MakeDir(ctx context.Context, parentDir model.Obj, dirName stri
func (d *Open123) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
toParentFileID, _ := strconv.ParseInt(dstDir.GetID(), 10, 64)

return d.move(srcObj.(File).FileId, toParentFileID)
return d.move([]int64{srcObj.(File).FileId}, toParentFileID)
}

func (d *Open123) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
Expand Down Expand Up @@ -152,7 +152,7 @@ func (d *Open123) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
func (d *Open123) Remove(ctx context.Context, obj model.Obj) error {
fileId, _ := strconv.ParseInt(obj.GetID(), 10, 64)

return d.trash(fileId)
return d.trash([]int64{fileId})
}

func (d *Open123) Put(ctx context.Context, dstDir model.Obj, file model.FileStreamer, up driver.UpdateProgress) (model.Obj, error) {
Expand Down Expand Up @@ -237,6 +237,32 @@ func (d *Open123) OfflineDownloadProcess(ctx context.Context, taskID int) (float
return d.queryOfflineDownloadStatus(ctx, taskID)
}

func (d *Open123) BatchMove(ctx context.Context, srcDir model.Obj, srcObjs []model.Obj, dstDir model.Obj, args model.BatchArgs) error {
var ids []int64
for _, obj := range srcObjs {
ids = append(ids, obj.(File).FileId)
}

return d.move(ids, dstDir.(File).FileId)
}

func (d *Open123) BatchRemove(ctx context.Context, batchRemoveObj model.BatchRemoveObj, args model.BatchArgs) error {
var ids []int64
for _, obj := range batchRemoveObj.RemoveObjs {
ids = append(ids, obj.(File).FileId)
}
return d.trash(ids)
}

func (d *Open123) BatchRename(ctx context.Context, batchRenameObj model.BatchRenameObj, args model.BatchArgs) error {
var renameList []string
for _, obj := range batchRenameObj.RenameObjs {
renameList = append(renameList, fmt.Sprintf("%d|%s", obj.Obj.(File).FileId, obj.NewName))
}

return d.batchRename(renameList)
}

var (
_ driver.Driver = (*Open123)(nil)
_ driver.PutResult = (*Open123)(nil)
Expand Down
56 changes: 39 additions & 17 deletions drivers/123_open/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"fmt"
"net/http"
"net/url"
"slices"
"strconv"
"strings"
"time"
Expand All @@ -31,6 +32,7 @@ var ( // 不同情况下获取的AccessTokenQPS限制不同 如下模块化易
Mkdir = InitApiInfo(Api+"/upload/v1/file/mkdir", 2)
Move = InitApiInfo(Api+"/api/v1/file/move", 1)
Rename = InitApiInfo(Api+"/api/v1/file/name", 1)
BatchRename = InitApiInfo(Api+"/api/v1/file/rename", 0)
Trash = InitApiInfo(Api+"/api/v1/file/trash", 2)
UploadCreate = InitApiInfo(Api+"/upload/v2/file/create", 2)
UploadComplete = InitApiInfo(Api+"/upload/v2/file/upload_complete", 0)
Expand Down Expand Up @@ -240,15 +242,18 @@ func (d *Open123) mkdir(parentID int64, name string) error {
return nil
}

func (d *Open123) move(fileID, toParentFileID int64) error {
_, err := d.Request(Move, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"fileIDs": []int64{fileID},
"toParentFileID": toParentFileID,
})
}, nil)
if err != nil {
return err
func (d *Open123) move(fileIDs []int64, toParentFileID int64) error {

for ids := range slices.Chunk(fileIDs, 100) {
_, err := d.Request(Move, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"fileIDs": ids,
"toParentFileID": toParentFileID,
})
}, nil)
if err != nil {
return err
}
}

return nil
Expand All @@ -268,14 +273,31 @@ func (d *Open123) rename(fileId int64, fileName string) error {
return nil
}

func (d *Open123) trash(fileId int64) error {
_, err := d.Request(Trash, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"fileIDs": []int64{fileId},
})
}, nil)
if err != nil {
return err
func (d *Open123) batchRename(renameList []string) error {
for names := range slices.Chunk(renameList, 30) {
_, err := d.Request(BatchRename, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"renameList": names,
})
}, nil)
if err != nil {
return err
}
}

return nil
}

func (d *Open123) trash(fileIDs []int64) error {
for cids := range slices.Chunk(fileIDs, 100) {
_, err := d.Request(Trash, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"fileIDs": cids,
})
}, nil)
if err != nil {
return err
}
}

return nil
Expand Down
89 changes: 89 additions & 0 deletions drivers/189/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,4 +204,93 @@ func (d *Cloud189) GetDetails(ctx context.Context) (*model.StorageDetails, error
}, nil
}

func (d *Cloud189) BatchMove(ctx context.Context, srcDir model.Obj, srcObjs []model.Obj, dstDir model.Obj, args model.BatchArgs) error {
var taskInfos []base.Json
for _, srcObj := range srcObjs {
taskInfos = append(taskInfos, base.Json{
"fileId": srcObj.GetID(),
"fileName": srcObj.GetName(),
"isFolder": func() int {
if srcObj.IsDir() {
return 1
}
return 0
}(),
})
}
taskInfosBytes, err := utils.Json.Marshal(taskInfos)
if err != nil {
return err
}
form := map[string]string{
"type": "MOVE",
"targetFolderId": dstDir.GetID(),
"taskInfos": string(taskInfosBytes),
}
_, err = d.request("https://cloud.189.cn/api/open/batch/createBatchTask.action", http.MethodPost, func(req *resty.Request) {
req.SetFormData(form)
}, nil)
return err
}

func (d *Cloud189) BatchCopy(ctx context.Context, srcDir model.Obj, srcObjs []model.Obj, dstDir model.Obj, args model.BatchArgs) error {
var taskInfos []base.Json
for _, srcObj := range srcObjs {
taskInfos = append(taskInfos, base.Json{
"fileId": srcObj.GetID(),
"fileName": srcObj.GetName(),
"isFolder": func() int {
if srcObj.IsDir() {
return 1
}
return 0
}(),
})
}

taskInfosBytes, err := utils.Json.Marshal(taskInfos)
if err != nil {
return err
}
form := map[string]string{
"type": "COPY",
"targetFolderId": dstDir.GetID(),
"taskInfos": string(taskInfosBytes),
}
_, err = d.request("https://cloud.189.cn/api/open/batch/createBatchTask.action", http.MethodPost, func(req *resty.Request) {
req.SetFormData(form)
}, nil)
return err
}

func (d *Cloud189) BatchRemove(ctx context.Context, batchRenameObj model.BatchRemoveObj, args model.BatchArgs) error {

var taskInfos []base.Json
for _, srcObj := range batchRenameObj.RemoveObjs {
taskInfos = append(taskInfos, base.Json{
"fileId": srcObj.GetID(),
"fileName": srcObj.GetName(),
"isFolder": func() int {
if srcObj.IsDir() {
return 1
}
return 0
}(),
})
}
taskInfosBytes, err := utils.Json.Marshal(taskInfos)
if err != nil {
return err
}
form := map[string]string{
"type": "DELETE",
"targetFolderId": "",
"taskInfos": string(taskInfosBytes),
}
_, err = d.request("https://cloud.189.cn/api/open/batch/createBatchTask.action", http.MethodPost, func(req *resty.Request) {
req.SetFormData(form)
}, nil)
return err
}

var _ driver.Driver = (*Cloud189)(nil)
Loading