如何使用s3 sdk正确删除s3对象

时间:2017-04-29 11:26:21

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

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

bucket name : example-cdn
Directory under it : files

现在,如果用户ID为2且时间为1492693589,则现在如果用户上传图片,则网址将为

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"));

现在当上面一行执行时,它也会删除file文件夹和2文件夹。我怎样才能删除图像文件image.png

2 个答案:

答案 0 :(得分:2)

Amazon S3中

文件夹不存在

Amazon S3是平面对象商店。它不会在文件夹/目录中存储文件。但是,文件可以使用包含斜杠的文件名(' Key')存储,例如images/cat.jpg。这给出了目录的幻觉,但实际上并没有创建目录。

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

aws s3 cp cat.jpg s3://bucket/images/cat.jpg

在管理控制台中查看存储桶时,将显示images目录,并且cat.jpg将位于其中。但它并不存在!

此命令会将图像移动到另一个(假装)目录:

aws s3p mv s3://bucket/images/cat.jpg s3://bucket/pictures/cat.jpg

这将使images目录消失,并显示一个新的pictures目录。同样,这是因为目录实际上并不存在 - 它们只是以这种方式显示,因为人类喜欢目录的概念。

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

但是,您可能会问,"如果我转到Amazon S3管理控制台并单击创建文件夹会怎样?当然会创建一个文件夹!"

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

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

答案 1 :(得分:0)

S3存储桶模拟文件夹。它们实际上并不存在。如果没有前缀为“files / 2 /”的键,则不会显示文件夹。

如果您确实希望“文件夹”不会消失,请确保其中有一个文件可以显示它们。

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