fix(s3): copy or move folder (close #1336)
This commit is contained in:
parent
f48365929e
commit
f692e6c011
@ -119,7 +119,7 @@ func (d *S3) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *S3) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
|
func (d *S3) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
|
||||||
err := d.copy(srcObj.GetPath(), stdpath.Join(stdpath.Dir(srcObj.GetPath()), newName), srcObj.IsDir())
|
err := d.copy(ctx, srcObj.GetPath(), stdpath.Join(stdpath.Dir(srcObj.GetPath()), newName), srcObj.IsDir())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -127,7 +127,7 @@ func (d *S3) Rename(ctx context.Context, srcObj model.Obj, newName string) error
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *S3) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
|
func (d *S3) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
|
||||||
return d.copy(srcObj.GetPath(), stdpath.Join(dstDir.GetPath(), srcObj.GetName()), srcObj.IsDir())
|
return d.copy(ctx, srcObj.GetPath(), stdpath.Join(dstDir.GetPath(), srcObj.GetName()), srcObj.IsDir())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *S3) Remove(ctx context.Context, obj model.Obj) error {
|
func (d *S3) Remove(ctx context.Context, obj model.Obj) error {
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
package s3
|
package s3
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/alist-org/alist/v3/internal/model"
|
"github.com/alist-org/alist/v3/internal/model"
|
||||||
|
"github.com/alist-org/alist/v3/internal/op"
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
@ -165,14 +167,41 @@ func (d *S3) listV2(prefix string) ([]model.Obj, error) {
|
|||||||
return files, nil
|
return files, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *S3) copy(src string, dst string, isDir bool) error {
|
func (d *S3) copy(ctx context.Context, src string, dst string, isDir bool) error {
|
||||||
srcKey := getKey(src, isDir)
|
if isDir {
|
||||||
dstKey := getKey(dst, isDir)
|
return d.copyDir(ctx, src, dst)
|
||||||
|
}
|
||||||
|
return d.copyFile(ctx, src, dst)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *S3) copyFile(ctx context.Context, src string, dst string) error {
|
||||||
|
srcKey := getKey(src, false)
|
||||||
|
dstKey := getKey(dst, false)
|
||||||
input := &s3.CopyObjectInput{
|
input := &s3.CopyObjectInput{
|
||||||
Bucket: &d.Bucket,
|
Bucket: &d.Bucket,
|
||||||
CopySource: &srcKey,
|
CopySource: aws.String("/" + d.Bucket + "/" + srcKey),
|
||||||
Key: &dstKey,
|
Key: &dstKey,
|
||||||
}
|
}
|
||||||
_, err := d.client.CopyObject(input)
|
_, err := d.client.CopyObject(input)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *S3) copyDir(ctx context.Context, src string, dst string) error {
|
||||||
|
objs, err := op.List(ctx, d, src, model.ListArgs{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, obj := range objs {
|
||||||
|
cSrc := path.Join(src, obj.GetName())
|
||||||
|
cDst := path.Join(dst, obj.GetName())
|
||||||
|
if obj.IsDir() {
|
||||||
|
err = d.copyDir(ctx, cSrc, cDst)
|
||||||
|
} else {
|
||||||
|
err = d.copyFile(ctx, cSrc, cDst)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user