fix(s3): copy or move folder (close #1336)

This commit is contained in:
Noah Hsu 2022-09-10 13:42:03 +08:00
parent f48365929e
commit f692e6c011
2 changed files with 35 additions and 6 deletions

View File

@ -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 {

View File

@ -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
}