【问题标题】:Checking if a object exists on amazon s3 using AWS api使用 AWS api 检查亚马逊 s3 上是否存在对象
【发布时间】:2013-07-14 21:16:09
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否要扩展 amazon-s3-php-class 库?它看起来像是官方 sdk 的精简版……您可能需要下载并使用官方 SDK 才能获得全部功能。
  • 我不确定,我想是的,但我在网上找不到它,而且每次都会出现 GIT 链接。

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


【解决方案1】:

您可能想多考虑一下整个“平面文件系统”。当我第一次开始编写 PHP 来与 S3 API 交互时,我期望能够遍历一个目录以及每个文件夹中的文件。但这不是它的工作原理!

这是来自 Ryan Parman,您引用的问题中的其中一个回答:

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

"/albums/Carcassonne-France/" 返回 false,因为没有同名的单数对象。"

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

s3://myBucket/myFolder/taco.jpg

s3://myBucket/myFolder/jambox.jpg

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

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

【讨论】:

  • 我想存储用户特定的图像,就像我们的 FB 个人资料一样,这样我就可以在他的仪表板上填充画廊并显示它。如果我随机存储它们,我将无法识别它们以每个用户为基础,或者说它会更乏味!
  • 你的意思是说我不能做我想做的事?? :P
  • @KillABug 您应该仍然可以实现这一点,您应该仍然可以使用类似目录的命名约定,只是它实际上没有文件夹。我的用例我有文件必须根据它们所在的“文件夹”进行处理并推送到数据库中。我的存储桶中的任何文件仍然遵守类似目录的命名约定:s3://myBucket/pretendFolder/fileName.gz,我只想寻找第一个 / 和第二个 / 之间的字符。由于 S3 Web 界面的行为就像有文件夹一样,所以我一直使用斜杠而不是另一个分隔符
  • @KillABug 我开始偏离您的实际问题。供您在这里使用,如果您有一个完全空的存储桶s3://myBucket/,并且您想将文件推送到s3://myBucket/myDir/MySubDir/picture.jpg,您只需调用putObject() 并将您的文件传递到s3://myBucket/myDir/MySubDir/picture.jpg 的密钥中,而无需检查是否存在“文件夹”。
  • 我认为他最大的问题是使用部分实现的库。如果您转到aws.amazon.com/sdkforphp 并下载 sdk,它会以 .phar 文件的形式出现,您可以将其包含在内,或者如果您愿意,也可以通过 composer 安装 sdk。然后查看此页面:docs.aws.amazon.com/aws-sdk-php-2/guide/latest/quick-start.html 并查看 Creating a clientIterators 部分
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我使用下面的简单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
        }
    

    【讨论】:

    • 这不是关于标题的黑客攻击。
    猜你喜欢
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多