【问题标题】:How to copy whole s3 folders using php aws sdk?如何使用 php aws sdk 复制整个 s3 文件夹?
【发布时间】:2019-01-13 12:37:57
【问题描述】:

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

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

也可以反转为

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

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

在执行“CopyObject”时出错 "https://s3.us-east-1.amazonaws.com/my_bucket/project1/"; AWS HTTP 错误:客户端错误:PUT https://s3.us-east-1.amazonaws.com/my_bucket/project1/ 导致 404 Not Found回复:NoSuchKey 指定的key没有 exists.34/F992013F6C3125(截断...) NoSuchKey(客户端): 指定的键不存在。 - NoSuchKey 指定的键没有 存在.34/F992013F6C312535YLrCcHhYJzimIKoR2knMvD3smhUbH75piDYTIx5SpKCPNkeWIifaYhKgezxnhpZzOHflzQngTnE=那里 上传时出错

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

【问题讨论】:

    标签: amazon-web-services api amazon-s3 copy aws-php-sdk


    【解决方案1】:

    Amazon S3 中不存在文件夹。

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

    s3merahkee/project1/foo.txt
    

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

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

    aws s3 cp foo.txt s3://my-bucket/s3merahkee/project1/foo.txt
    

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

    复制整个文件夹的最简单方法是使用AWS Command-Line Interface (CLI),如下所示:

    aws s3 cp --recursive s3://my-bucket/folder1 s3://my-bucket/folder2
    

    【讨论】:

    • 但我想在 php aws sdk 而不是 CLI 中有代码
    • 很好。然后,您必须复制“文件夹”中的所有文件。没有复制文件夹的功能。
    【解决方案2】:

    这里解释了如何使用 PHP SDK 在 Amazon S3 内、从一个存储桶到另一个存储桶或在同一个存储桶中复制多个对象:https://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectUsingPHP.html

    如果简单的话,从文件列表中创建一批操作:

    $batch[] = $s3->getCommand('CopyObject', [
        'Bucket'     => $targetBucket,
        'Key'        => "{targetKeyname}-{$i}",
        'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
    ]);
    

    并使用\Aws\CommandPool::batch($s3, $batch); 发送该批次

    【讨论】:

      【解决方案3】:

      在 S3 中的对象包含完整文件路径的意义上,接受的答案是正确的。但是,有一种方法可以使用 SDK 来执行此操作,因此您无需使用命令行。

      AWS 建议使用 Transfer 对象来执行此操作:https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-transfer.html

      【讨论】:

      • Transfer 对象不允许 s3 到 s3 的操作。它仅适用于客户端和 s3 之间的事务。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2022-01-26
      • 2020-11-02
      • 2013-09-15
      • 2019-01-13
      相关资源
      最近更新 更多