2012-11-02 87 views
1

在AWS-SDK,它列出了表格的Ruby代码:AWS-SDK S3大名单目录失败

s3 = AWS::S3.new 
bucket = s3.buckets[bucket_name] 
tree = bucket.as_tree(:prefix => 'myshop/products') 
directories = tree.children.select(&:branch?).collect(&:prefix) 

失败的错误: “无法找到S3列表标记物体响应”

目录

/myshop/products/1474472/original.jpg 
/myshop/products/1474472/small.jpg 
/myshop/products/1474472/mini.jpg 
/myshop/products/1333333/original.jpg 
/myshop/products/1333333/small.jpg 
/myshop/products/1333333/mini.jpg 

结构...

更多的100 000 OBJ

我想验证(例如, “1474472”)的目录中创建

我的计划:AWS-S3-列表 - >红宝石阵列 - >发现阵列(array.include?)

!!!需要非常快速的方法 - 即将结束的世界:)

+0

我不熟悉Ruby SDK,但S3只允许您一次列出1000个对象,因此列出100,000个对象将导致至少100个HTTP请求。如果你想检查某个特定对象的存在,那么发送该对象的HEAD请求是最好的方法。这听起来像你想检查一个或多个文件匹配给定的前缀,你能不能适应你现有的前缀搜索包括子目录名称? –

+0

嗨,aws ping需要288毫秒 - 0.3秒х10000 = 3000秒= 50分钟,我很长。 – memoris

回答

0

有没有这样的东西在亚马逊S3中的文件夹。这是一个“平面”文件系统。查看this answer

您真正需要的是验证您的存储桶中是否存在给定的前缀(例如“/ myshop/products/1474472”)。
他们的REST API绝对支持它,看看the documentation。您需要列出与给定prefix相匹配的密钥(这将是“文件名”),可以作为参数传递。您还可以通过将max-keys参数设置为1来优化您的呼叫。这样,如果您在响应中收到任何非零数量的项目,则存储区中已经包含名称以给定前缀开头的文件。