如何使用 php aws sdk 复制整个 s3 文件夹?

Dee*_*k N 7 api copy amazon-s3 amazon-web-services aws-php-sdk

我想在 aws s3 存储桶中复制一个文件夹。我能够复制文件,但要求是我应该能够使用其他名称复制整个 s3 文件夹。示例:如果文件夹名称是,project1我需要将其复制project1-copy到名为 的存储桶中my_bucket。我已经尝试过下面的代码。

$s3->copyObject([
    'Bucket'     => my_bucket,
    'Key'        => "project-copy",
    'CopySource' => "my_bucket/project1",
]);
Run Code Online (Sandbox Code Playgroud)

并且也反转为

$s3->copyObject([
    'Bucket'     => my_bucket,
    'Key'        => "project1",
    'CopySource' => "my_bucket/project-copy",
]);
Run Code Online (Sandbox Code Playgroud)

在这两种情况下我都收到错误

在“ https://s3.us-east-1.amazonaws.com/my_bucket/project1/ ”上执行“CopyObject”时出错;AWS HTTP 错误:客户端错误:PUT https://s3.us-east-1.amazonaws.com/my_bucket/project1/导致 404 Not Found响应:NoSuchKey指定的密钥不存在。34/F992013F6C3125(截断...)NoSuchKey(客户端):指定的密钥不存在。- NoSuchKey指定的密钥不存在。34/F992013F6C312535YLrCcHhYJzimIKoR2knMvD3smhUbH75piDYTIx5SpKCPNkeWIifaYhKgezxnhpZzOHflzQngTnE=上传时出错

我确信我使用的是正确的区域和文件夹名称以及存储桶名称。仍然出现上述错误。我该如何解决这个问题?

Joh*_*ein 1

Amazon S3 中不存在文件夹。

相反,对象的键(文件名)包含完整路径,例如:

s3merahkee/project1/foo.txt
Run Code Online (Sandbox Code Playgroud)

如果您希望复制整个“文件夹”,则需要复制该路径中的所有文件对象。

另请注意,您不需要预先创建文件夹来存储文件。您可以运行这样的命令:

aws s3 cp foo.txt s3://my-bucket/s3merahkee/project1/foo.txt
Run Code Online (Sandbox Code Playgroud)

该命令将“创建”s3merahkeeproject1文件夹。好吧,实际上它根本不会创建它们,因为它们不存在,但 Amazon S3 管理控制台甚至命令aws s3 ls都会使其“看起来”就像这些文件夹存在一样。如果您要删除该文件,这些文件夹将立即消失(因为它们实际上并不存在)。

复制整个文件夹的最简单方法是使用AWS 命令​​行界面 (CLI),如下所示:

aws s3 cp --recursive s3://my-bucket/folder1 s3://my-bucket/folder2
Run Code Online (Sandbox Code Playgroud)