如何使用 PHP 在 S3 存储桶中创建文件夹

How to create a folder within S3 bucket using PHP

我正在尝试在 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' => "",
    ));

Amazon S3 doesn't really have directories:

In Amazon S3, buckets and objects are the primary resources, where objects are stored in buckets. Amazon S3 has a flat structure with no hierarchy like you would see in a typical file system. However, for the sake of organizational simplicity, the Amazon S3 console supports the folder concept as a means of grouping objects. Amazon S3 does this by using key name prefixes for objects.

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

的目录

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

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

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

/* 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’);

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

文件夹是人类的概念,使用“/”字符分隔文件夹。但是S3不关心。

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

但是没办法"create a folder"。

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

您可以做的最接近 "creating a folder" 的事情是创建一个在其键末尾带有“/”的 0 字节对象。例如 "my/desired/folder/structure/"。但它只是桶中的另一个对象。它不会对存储桶或存储桶中任何其他对象的创建或操作产生任何影响。

$client->putObject([
  'Bucket' => 'bucket',
  'Key' => 'folder/', ]);

对于 'version' => '2006-03-01',