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

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

问题描述:

我试图在S3亚马逊存储桶中创建文件夹,但我发现很难找到正确的文档来充分解释需要什么。我有以下代码/伪代码来创建文件夹。任何人都可以解释或提供的我需要将代码如何使用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' => "", 
    )); 

S3并没有超出桶文件夹,但对象(文件)可以在自己的名称中/秒(正斜杠),并且有方法基于一个前缀,使检索你模拟一个目录列表。这意味着你不能创建一个空文件夹。

因此,解决方法将放置一个空的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’); 
+2

“因此,解决方法将放置一个空的txt文件并在病房后删除它,但文件夹结构将保留。”这不是真的。如果没有创建文件夹,则在删除该对象后没有任何文件夹可以保留。 –

+0

@MattHouser在这里,当他在“/folder/test.txt”文件夹中创建一个空的txt文件时,当他删除“test.txt”时,该文件夹将保留。 – error2007s

+0

这是PHP客户端'putObjectFile'方法的内置副作用吗?这不是AWS API的标准行为。 'putObjectFile'是一个传统的方法。 PHP的'putObject'方法,现代版本,也会这样做吗? –

Amazon S3 doesn't really have directories内放置的参数的示例:

在亚马逊S3,水桶和对象是第一资源,其中,对象存储在存储桶。 Amazon S3具有扁平的结构,没有层次结构,就像您在典型的文件系统中看到的那样。但是,出于简化组织的考虑,Amazon S3控制台支持将文件夹概念作为分组对象的一种手段。 Amazon S3通过使用对象的键名称前缀来完成此操作。

取而代之,它基于对象的关键字的名称将其伪造。只需使用诸如some/directory/file.txt之类的密钥上载对象,并且许多工具(包括AWS控制台中的S3接口)都会像您在名为some的目录中名为directory的目录中有一个名为file.txt的对象那样工作。

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

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

文件夹是使用'/'字符分隔文件夹的人类概念。但S3不在乎。

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

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

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

“创建文件夹”最接近你可以做的是创建一个0字节的对象,在它的关键字末尾加上'/'。例如“my/desired/folder/structure /”。但这只是另一个目标。它不会对存储桶或存储桶中的任何其他对象的创建或操作产生任何影响。