2016-04-26 150 views
0

因此,我想获取我的S3存储桶中所有对象的列表。我只是把它放在一个快速设置的快速路线应用程序中(这并不重要,它只是表达我所熟悉的)。从S3存储桶中获取物品

所以我做:

var allObjs = []; 

s3.listObjects({Bucket: 'myBucket'}, function(err, data) { 

     var stringifiedObjs = JSON.stringify(allObjs); 


     fs.writeFile("test", stringifiedObjs, function(err) {}) 

} 

这抓住了我的对象,stringifys并将其写入到一个名为test的文件。我遇到的问题是它只能获得1,000个结果。

我在某处阅读(我无法找到)AWS将您限制为每次调用1000个结果的位置。

我该如何重新运行并抓取下一个1000?但是确保下一个增量1,000不是第一个?

简而言之,我如何获得S3存储桶中的每个对象?我一直迷失在文档中。

谢谢!

编辑

这是我的目标,我回去:

{ Key: 'bucket_path/e11_19_9a31mv3ot51tm384grjd6rdj51boxx_q_q112.png', 
    LastModified: Sat Apr 23 2016 09:16:23 GMT+0100 (BST), 
    ETag: '"7d50fsdfsd4sda159b32cf85c683c5924"', 
    Size: 704222, 
    StorageClass: 'STANDARD', 
    Owner: 
    { DisplayName: 'servers', 
     ID: '58af203151c51eddf2sdfs411e0b91d274a8fda23f58280f9b06371e436f7' } }, 

回答

1

当您收到来自listObjects打电话给你的回应,你的反应应该包括data财产2个非常重要的领域:

  • IsTruncated - 如果有多个键返回。否则为假。
  • NextMarker - 下一次拨打listObjectsMarker属性中使用的值。

所以你打电话listObjects后,您需要检查IsTruncated场,看它是否是True。如果是,则将NextMarker的值填入Marker的值,并再次调用listObjects

更新:

这样看来,AWS.Request对象有一个.eachPage方法可用于自动进行多次调用。所以有一个神奇的功能为你做这项工作。

var pages = 1; 
s3.listObjects().eachPage(function(err, data) { 
    if (err) return; 
    console.log("Page", pages++); 
    console.log(data); 
}); 

来源:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html

+0

'{IsTruncated:真, 标记: '', 内容:[{myObjects}], 名称: 'myBucket', 前缀:'', MaxKeys:1000, CommonPrefixes:[]}' 这是我回来的回应..没有'NextMarker'我也从 – PourMeSomeCode

+0

打电话忽略我以前的评论欢呼男人!这工作!你提到的'.eachPage'实际上会自动为你添加标记。甜心:D – PourMeSomeCode

3

您需要设置属性作为以前的最后一个元素得到

检查的文件作为参考(如你已经做的:))

http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html

+0

干杯!我看了一下,我的超级新,所以我有点失落。当我设置标记时,你的意思是,标记将是我从上次结果中获得的最后一个对象吗? – PourMeSomeCode

+0

这是一个关键,所以你应该把它设置为最后一个对象的关键字(通常是文件名)。你可以看到单个对象的属性列表并找到'key'属性 – Pietro

+0

你可以在这里看到一个响应的例子http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html#RESTBucketGET-响应 - 每个内容的例子都有这样的关键' my-third-image.jpg' – Pietro

相关问题