Php 使用AWSAPI检查AmazonS3上是否存在对象

Php 使用AWSAPI检查AmazonS3上是否存在对象,php,api,amazon-web-services,amazon-s3,Php,Api,Amazon Web Services,Amazon S3,我正在使用AWS api,在检查现有对象(文件夹)时遇到问题。 我问了这个问题,但它对我没有帮助,因为我使用的是最新更新的SDK。我搜索了SDK,找到了应该可用的SDK,即,doesObjectExist,但我无法在任何地方找到函数定义。我的s3.php文件没有此函数。是我的S3.php类。 此外,我还了解到S3不支持文件夹结构,但由于采用了平面文件系统,它在视觉上看起来像是存储在文件夹中。现在,如果我必须搜索S3上的文件夹1024x768,我是否只需要检查bucket的根?我是说像这样

我正在使用AWS api,在检查现有对象(文件夹)时遇到问题。
我问了这个问题,但它对我没有帮助,因为我使用的是最新更新的SDK。
我搜索了SDK,找到了应该可用的SDK,即,
doesObjectExist
,但我无法在任何地方找到函数定义。我的
s3.php
文件没有此函数。是我的S3.php类。
此外,我还了解到S3不支持文件夹结构,但由于采用了平面文件系统,它在视觉上看起来像是存储在文件夹中。现在,如果我必须搜索S3上的文件夹
1024x768
,我是否只需要检查bucket的根?我是说像这样

     $chkFileExist = $s3->doesObjectExist($bucketName,'1024x768');

我需要检查文件夹是否存在,如果不存在,请使用API函数动态创建。如果存在,请将文件存储在那里。
我需要帮助实现此功能。请任何人根据他们的经验提出解决方案。
感谢您的关注。

您可能需要对整个“平面文件系统”。当我第一次开始编写PHP与S3API接口时,我希望能够遍历一个目录和每个文件夹中的文件。但这不是它的工作原理

这是来自Ryan Parman,您提到的一个问题的回答之一:

S3是一个平面文件系统。没有文件夹。只有带斜杠的文件名。一些S3浏览工具选择在软件中显示“文件夹”的概念,但它们只是假装而已

“/albums/Carcasonne France/”返回false,因为没有具有该名称的单数对象。”

如果有具有以下路径的对象:

s3://myBucket/myFolder/taco.jpg

s3://myBucket/myFolder/jambox.jpg

如果您检查对象
s3://myBucket/myFolder/
是否存在,它将返回false,因为没有具有该特定名称的对象


了解更多关于在文件夹不存在时为什么要创建该文件夹的信息可能会有所帮助,但如果要将对象放入S3中的特定“文件夹”,可以使用
putObject()
方法。

@Dan是正确的。但是,可能值得一看,它使您能够在S3中使用PHP的内置文件系统函数。

我使用下面一个简单的
hack实现了同样的功能。我们必须在每个文件夹中包含一个文件,并且可以检查该文件,因此如果该文件存在,则意味着文件夹路径有效。在我的例子中,我获取的文件是donotdelete.txt,这样任何s3查看器都可以理解不应该删除此文件。现在使用
getObjectInfo
函数检查此文件。例如:

    if($s3->getObjectInfo("bucketName","folder_name/donotdelete.txt")))
    { 
        //Do Whatever you want to do if folder exists
    }
    else
    {
        //Do whatever you want to do if folder doesn't exist
    }

您是否正在尝试扩展amazon-s3-php-class库?它看起来像是官方sdk的精简版。。。你可能需要下载并使用官方SDK才能获得完整的功能。我不确定,我也这么认为,但我在网上找不到它,每次都会出现GIT链接。我想存储用户特定的图像,就像我们的FB配置文件一样,这样我就可以在他的仪表板上填充图库并显示它。如果我随机存储它们,我将无法根据每个用户识别它们,或者更确切地说,这将更加乏味!!你的意思是说我不能做我想做的事??:P@KillABug您应该仍然能够做到这一点,您应该仍然能够使用类似于命名约定的目录,它实际上没有文件夹。我的用例中有一些文件需要处理,并根据它们所在的“文件夹”推送到数据库中。我的bucket中的任何文件仍然遵循类似命名约定的目录:
s3://myBucket/folder/fileName.gz
,我只会查找第一个
/
和第二个
/
之间的字符。由于S3Web界面的行为类似于文件夹,因此我一直使用斜杠而不是另一个分隔符character@KillABug我开始偏离你的实际问题了。对于您在这里的使用,如果您有一个完全空的bucket
s3://myBucket/
,并且您想将一个文件推入
s3://myBucket/myDir/MySubDir/picture.jpg
,您只需调用
putObject()
并将文件传递到
s3://myBucket/myDir/MySubDir/picture.jpg>的键中,而无需检查是否存在“文件夹”.我认为他最大的问题是使用一个部分实现的库。如果您访问并下载sdk,它将作为一个.phar文件提供,您可以包括该文件,或者如果您愿意,可以通过composer安装sdk。然后查看此页面:并查看
创建客户机
迭代器
部分这并不是对标题的攻击。