Php 如何使用S3SDK正确删除s3对象

Php 如何使用S3SDK正确删除s3对象,php,amazon-web-services,amazon-s3,Php,Amazon Web Services,Amazon S3,我有一个用户上传内容的存储桶。这是水桶的样子 bucket name : example-cdn Directory under it : files 现在,如果用户id是2,时间是1492693589,那么现在如果用户上传图像,url将是 example-cdn/files/2/1492693589/image.png 现在,如果我试图删除那个特定的图像,那么整个目录都会随文件一起删除 这是密码 $s3 = new S3Client([ 'version' =>

我有一个用户上传内容的存储桶。这是水桶的样子

bucket name : example-cdn
Directory under it : files
现在,如果用户id是
2
,时间是
1492693589
,那么现在如果用户上传图像,url将是

example-cdn/files/2/1492693589/image.png
现在,如果我试图删除那个特定的图像,那么整个目录都会随文件一起删除

这是密码

$s3 = new S3Client([
            'version' => 'latest',
            'region' => 'ap-south-1',
            'credentials' => array(
                'key' => '************',
                'secret' => '*****************************'
       )
  ]);

 $s3->deleteObject(array('Bucket' => "example-cdn", 'Key' => "files/2/1492693589/image.png"));

现在,当执行上述行时,还将删除
文件
文件夹和
2
文件夹。如何仅删除图像文件
image.png

S3 bucket仿真文件夹。它们实际上并不存在。如果没有前缀为“files/2/”的键,则文件夹将不可见

如果你真的不想“文件夹”消失,请确保那里有一个文件使它们出现


澄清一下:这不是sdk独有的,这只是服务的工作方式。

文件夹在Amazon S3中不存在

AmazonS3是一个平面对象存储。它不在文件夹/目录中存储文件。但是,可以使用包含斜杠的文件名(“键”)存储文件,例如
images/cat.jpg
。这给人一种目录的错觉,但实际上并没有创建目录

例如,此命令将仅通过将文件命名为(假装)目录中的文件来创建
图像
目录:

aws s3 cp cat.jpg s3://bucket/images/cat.jpg
aws s3p mv s3://bucket/images/cat.jpg s3://bucket/pictures/cat.jpg
在管理控制台中查看存储桶时,将显示
图像
目录,并且
cat.jpg
将位于其中。但它并不真的存在

此命令将图像移动到其他(假装)目录:

aws s3 cp cat.jpg s3://bucket/images/cat.jpg
aws s3p mv s3://bucket/images/cat.jpg s3://bucket/pictures/cat.jpg
这将使
图像
目录消失,并出现一个新的
图片
目录。同样,这是因为目录实际上并不存在——它们只是以这种方式显示出来,因为人类喜欢目录的概念

在使用AWSAPI时,目录称为公共前缀。它们的行为类似于目录,但并不存在

但是,您可能会问,“如果我转到AmazonS3管理控制台并单击创建文件夹,会发生什么情况?肯定会创建文件夹!”

实际上,不是。它只是创建一个带有目录名的零字节文件,强制显示目录。删除该零字节文件将使目录消失,因为该路径中不再有任何内容

底线:目录不存在,但可以随意地将它们移入移出,就好像它们确实存在一样。

请注意,如果您确实希望“文件夹”在控制台中停留,即使没有对象,也可以始终在控制台中或从SDK/API中创建它们,例如,创建一个空的(0字节)带有键
files/2/
的对象将显示文件夹“files”,以及其中的文件夹“2”。但正如您几乎指出的,这没有任何意义,只是为了在观看控制台时有利于您的眼球。由于
files/2/
是一个对象,因此伪结构在不存在(其他)对象的情况下保持可见。