2

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

4 回答 4

6

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

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

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

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

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

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

于 2016-08-16T01:36:05.167 回答
5

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’);
于 2016-08-16T01:29:20.670 回答
4

Amazon S3 并没有真正的目录

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

相反,它根据对象键的名称伪造它。只需使用类似键上传一个对象some/directory/file.txt,许多工具(包括 AWS 控制台中的 S3 接口)都会像您file.txtdirectory名为some.

另请参阅Amazon S3 boto - 如何创建文件夹?

于 2016-08-16T01:25:16.070 回答
0
$client->putObject([
  'Bucket' => 'bucket',
  'Key' => 'folder/', ]);

对于“版本”=>“2006-03-01”,

于 2021-07-01T09:56:03.703 回答