在aws s3中将文件夹从一个文件夹复制到另一个文件夹

时间:2019-05-21 18:33:28

标签: php amazon-s3

我正尝试将文件夹复制到aws s3中的另一个文件夹,如下所示:

$s3 = S3Client::factory(
    array(
      'credentials' => array(
        'key' => 'testbucket',
        'secret' => BUCKET_SECRET //Global constant
      ),
      'version' => BUCKET_VERSION, //Global constant
      'region'  => BUCKET_REGION  //Global constant
    )
  );
$sourceBucket = 'testbucket';
$sourceKeyname = 'admin/collections/Athena'; // Object key
$targetBucket = 'testbucket';
$targetKeyname = 'admin/collections/Athena-New';

// Copy an object.
$s3->copyObject(array(
    'Bucket'     => $targetBucket,
    'Key'        => $targetKeyname,
    'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
));

它抛出错误

  

严重错误:未捕获的异常'Aws \ S3 \ Exception \ S3Exception'与   消息“在执行“ CopyObject”时出错   “ https://testbucket.s3.us-east-2.amazonaws.com/admin/collections/Athena-New”;   AWS HTTP错误:客户端错误:PUT https://testbucket.s3.us-east-2.amazonaws.com/admin/collections/Athena-New   产生了404 Not Found响应:   NoSuchKey指定的密钥不正确   exist.admin / collections /雅典娜NoSuchKey指定的密钥不正确   exist.admin / collections / Athena29EA131A5AD9CB836OjDNLgbdLPLMd0t7MuNi4JH6AU5pKfRmhCcWigGAaTuRlqoX8X5aMicWTui56rTH1BLRpJJtmc ='

我不知道为什么它会生成错误的存储段网址,例如

  

https://testbucket.s3.us-east-2.amazonaws.com/admin/collections/Athena-New

右桶铲斗网址为

  

https://s3.us-east-2.amazonaws.com/testbucket/admin/collections/Athena-New

为什么在URL中s3之前将存储桶名称附加到其后?

简单来说,我想复制

的内容
  

https://s3.us-east-2.amazonaws.com/testbucket/admin/collections/Athena

  

https://s3.us-east-2.amazonaws.com/testbucket/admin/collections/Athena-New

1 个答案:

答案 0 :(得分:1)

由于文件夹实际上不存在,因此无法在Amazon S3中“复制文件夹”。

相反,对象的完整路径存储在对象的Key(文件名)中。

因此,一个对象可能被称为:

admin/collections/Athena/foo.txt

如果您希望将所有对象从一个“文件夹”复制到另一个“文件夹”,那么您将需要:

  • 获取给定Prefix的存储桶的列表(实际上是文件夹的完整路径)
  • 遍历返回的每个对象,并一次将对象复制到新名称(这实际上将其放置在新文件夹中)

因此,它将admin/collections/Athena/foo.txt复制到admin/collections/Athena-New/foo.txt

相关问题