【问题标题】:How to create a folder within S3 bucket using PHP如何使用 PHP 在 S3 存储桶中创建文件夹
【发布时间】:2016-12-22 06:14:24
【问题描述】:

我正在尝试在 S3 亚马逊存储桶中创建一个文件夹,但我发现很难找到正确的文档来充分解释所需内容。我有以下用于创建文件夹的代码/伪代码。谁能解释或提供我需要在代码中放置的参数示例

use vendor\aws\S3\S3Client;

$bucket_url = 'https://***.amazonaws.com/***/';
$folder_name = $username . '/';

$s3Client = new vendor\aws\S3\S3Client([
        'version' => AWS_VERSION,
        'region' => AWS_REGION,
        'credentials' => [
            'key' => AWS_KEY,
            'secret' =>AWS_SECRET,
        ],
    ]);

    $s3Client->putObject(array(
        'Bucket' => AWS_BUCKET, // Defines name of Bucket
        'Key' => AWS_PATH . $folder_name, //Defines Folder name
        'Body' => "",
    ));

【问题讨论】:

    标签: php amazon-web-services amazon-s3 create-directory


    【解决方案1】:
    $client->putObject([
      'Bucket' => 'bucket',
      'Key' => 'folder/', ]);
    

    对于'版本' => '2006-03-01',

    【讨论】:

      【解决方案2】:

      Amazon S3 没有文件夹的概念。对于 S3,所有对象都只是一个带有数据的键名。

      文件夹是一个人类概念,它使用“/”字符来分隔文件夹。但 S3 不在乎。

      当您使用许多第三方工具(甚至是 AWS 管理控制台)时,这些工具通常会查看您前缀下的对象键,当它在其中看到“/”时,会将其解释为文件夹.

      但是没有办法“创建文件夹”。

      如果您只是 PutObject 一个带有所需完整路径的键的对象(例如,“my/desired/folder/structure/file.txt”),Amazon S3 将把它放在那里。它不像许多文件系统中必须存在文件夹才能创建文件。

      您可以做的最接近“创建文件夹”的方法是创建一个 0 字节对象,并在其键的末尾添加一个“/”。例如“我的/期望的/文件夹/结构/”。但这只是桶中的另一个对象。它不会对桶或桶中任何其他对象的创建或操作产生任何影响。

      【讨论】:

        【解决方案3】:

        S3 在存储桶之外没有文件夹,但对象(文件)的名称中可以包含 /s(正斜杠),并且有一些方法可以根据允许您模拟目录列表的前缀进行检索。这意味着,您不能创建一个空文件夹。

        因此,解决方法是放置一个空的txt文件并在病房后将其删除,但文件夹结构将保留。

        /* function to upload empty test.txt file to subfolders /folder/ on S3 bucketname */
        $s3->putObjectFile(‘test.txt’, ‘bucketname’, ‘/folder/test.txt’, S3::ACL_PUBLIC_READ);
        
        /* function to delete empty test.txt file to subfolders /folder/ on S3 bucketname */
        $s3->deleteObject(‘bucketname’, ‘/folder/test.txt’);
        

        【讨论】:

        • "所以解决方法是放置一个空的 txt 文件并在病房后将其删除,但文件夹结构将保留。"这不是真的。如果没有创建文件夹,则删除对象后没有文件夹。
        • @MattHouser 在这里,当他将一个空的 txt 文件放在“/folder/test.txt”文件夹中时,当他删除“test.txt”时,该文件夹仍然存在。
        • 这是 PHP 客户端 putObjectFile 方法的内置副作用吗?这不是 AWS API 的标准行为。 putObjectFile 是一种遗留方法。 PHP putObject 方法,现代版本,也会这样做吗?
        • 连接S3存储桶需要的安全信息,只是我通过控制台登录的用户名和密码吗?文档对此不是很清楚。感谢您的回答。
        • @KPM 您需要访问密钥和秘密密钥或使用 IAM 角色(如果在 EC2 实例上运行):docs.aws.amazon.com/aws-sdk-php/v2/guide/credentials.html
        【解决方案4】:

        Amazon S3 doesn't really have directories:

        在 Amazon S3 中,存储桶和对象是主要资源,其中对象存储在存储桶中。 Amazon S3 具有扁平结构,没有您在典型文件系统中看到的层次结构。但是,为了组织简单,Amazon S3 控制台支持将文件夹概念作为对对象进行分组的一种方式。 Amazon S3 通过使用对象的键名前缀来做到这一点。

        相反,它根据对象键的名称来伪造它。只需使用 some/directory/file.txt 之类的密钥上传对象,许多工具(包括 AWS 控制台中的 S3 接口)将像您在名为 directory 的目录中的 some 目录中拥有一个名为 file.txt 的对象一样.

        另见Amazon S3 boto - how to create a folder?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-23
          • 1970-01-01
          • 2020-10-28
          • 1970-01-01
          • 2012-08-30
          • 2016-09-26
          • 1970-01-01
          • 2011-01-16
          相关资源
          最近更新 更多