2016-04-26 8 views
0

Also ich möchte eine Liste aller Objekte in meinem S3-Bucket erhalten. Ich habe es gerade in eine Express-Route-Anwendung gebracht, die ich schnell eingerichtet habe (es ist nicht wirklich wichtig, dass es nur in Express ist, womit ich mich auskenne).Greifen von Objekten aus einem S3-Bucket

Also ich tue:

var allObjs = []; 

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

     var stringifiedObjs = JSON.stringify(allObjs); 


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

} 

Welche meine Objekte packt, stringifys sie und schreibt sie in einem Test namens Datei. Das Problem, das ich habe, ist, dass es nur 1.000 Ergebnisse bekommt.

Ich habe irgendwo gelesen (ich kann nicht finden, wo), dass AWS Sie auf 1.000 Ergebnisse pro Anruf beschränkt.

Wie kann ich das wiederholen und die nächsten 1.000 greifen? Aber so stellen Sie sicher, dass es die nächste inkrementierte 1.000 nicht immer die erste ist?

Kurz gesagt, wie kann ich jedes Objekt in meinem S3-Bucket bekommen? Ich bin in der Dokumentation verloren gegangen.

Vielen Dank!

EDIT

Das ist mein Ziel ich zurück:

{ 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' } }, 

Antwort

1

Wenn Sie Ihre Antwort vom listObjects Anruf erhalten, sollten Sie Ihre Antwort sind 2 sehr wichtige Felder in der data Eigenschaft:

  • IsTruncated - True, wenn es mehr Tasten zurück sind. Falsch sonst.
  • NextMarker - Der Wert, der für die Eigenschaft Marker beim nächsten Aufruf von listObjects verwendet werden soll.

So, nachdem Sie listObjects rufen, müssen Sie das IsTruncated Feld überprüfen, um zu sehen, ob es True ist. Wenn ja, dann füttern Sie den Wert von NextMarker in den Wert für Marker und rufen Sie erneut listObjects.

Update:

Es scheint, dass AWS.Request Objekt eine .eachPage Methode hat, die automatisch verwendet werden kann, um mehrere Anrufe zu tätigen. Es gibt also eine magische Funktion, diese Arbeit für dich zu erledigen.

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

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

+0

'{isTruncated: true, Marker: '', Inhalt: [{MyObjects}], Name: 'myBucket', Präfix : '', MaxKeys: 1000, CommonPrefixes: []} ' Dies ist die Antwort, die ich zurück .. es gibt keine' NextMarker' für mich auch Anruf von – PourMeSomeCode

+0

Ignoriere meinen vorherigen Kommentar Prost Mann! Das funktioniert! Die von Ihnen erwähnte ".eachPage" fügt den Marker automatisch automatisch für Sie ein. Süß: D – PourMeSomeCode

3

Sie benötigen die Eigenschaft als letztes Element des vorherigen setzen

Überprüfen Sie die Dokumentation als Referenz erhalten (wie Sie bereits :) :)

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

+0

Prost! Ich habe es mir angeschaut, mein ich bin super neu, also bin ich etwas verloren gegangen. Wenn ich den Marker setze, meinst du, der Marker ist das letzte Objekt, das ich von meinen letzten Ergebnissen bekommen habe? – PourMeSomeCode

+0

Es ist ein Schlüssel, also sollten Sie ihn auf den Schlüssel (normalerweise den Dateinamen) des letzten Objekts setzen. Sie können die Eigenschaftsliste des einzelnen Objekts sehen und die Eigenschaft 'key' finden – Pietro

+0

Sie können ein Beispiel der Antwort hier sehen http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html#RESTBucketGET- Antworten-Beispiele jeder Inhalt hat einen Schlüssel wie folgt ' mein-drittes-bild.jpg' – Pietro

Verwandte Themen