सवाल जावा का उपयोग करके एक बाल्टी में सभी एडब्ल्यूएस एस 3 ऑब्जेक्ट्स को कैसे सूचीबद्ध करें


जावा का उपयोग कर एस 3 बाल्टी के भीतर सभी वस्तुओं की सूची प्राप्त करने का सबसे आसान तरीका क्या है?

List<S3ObjectSummary> s3objects = s3.listObjects(bucketName,prefix).getObjectSummaries();

यह उदाहरण केवल 1000 आइटम देता है।


44
2017-11-06 13:24


मूल


आपके द्वारा उपयोग किए जा रहे S3 पैकेज और संस्करण को प्रदान करने के लिए प्रश्न संपादित किया जाना चाहिए। - Gray
यह मेरे लिए काम किया: codeflex.co/get-list-of-objects-from-s3-directory - machine_messiah
कैसे वे 1000 फाइलों की सीमा को हार्डकोड कर सकते हैं। यह इतना बग प्रवण है, मुझे अब अपना उत्पादन ठीक करने की ज़रूरत है। - Przemek


जवाब:


यह एक कामकाज हो सकता है लेकिन यह मेरी समस्या हल हो गया:

ObjectListing listing = s3.listObjects( bucketName, prefix );
List<S3ObjectSummary> summaries = listing.getObjectSummaries();

while (listing.isTruncated()) {
   listing = s3.listNextBatchOfObjects (listing);
   summaries.addAll (listing.getObjectSummaries());
}

80
2017-11-07 08:17



मेरे लिए कामकाज की तरह दिखता नहीं है, जो कि एपीआई का इच्छित उपयोग प्रतीत होता है। - Joachim Sauer
किसी ने सुझाव दिया इस यदि आप रुचि रखते हैं, तो अपने उत्तर में संपादित करें - Benjol
s3.listObjects में प्रति लिस्टिंग 1000 तत्वों की डिफ़ॉल्ट सीमा है, इसलिए @ जोचिमसॉयर ने कहा कि यह API का इच्छित उपयोग है - Fgblanch
क्या एक ही समय में संस्करण जानकारी प्राप्त करना संभव है? - gonzobrains
यह खतरनाक धारणा बनाता है कि List द्वारा लौटा getObjectSummaries() उत्परिवर्तनीय है। - Steve Kuo


यह एडब्ल्यूएस दस्तावेज से सीधे है:

AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());        

ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
    .withBucketName(bucketName)
    .withPrefix("m");
ObjectListing objectListing;

do {
        objectListing = s3client.listObjects(listObjectsRequest);
        for (S3ObjectSummary objectSummary : 
            objectListing.getObjectSummaries()) {
            System.out.println( " - " + objectSummary.getKey() + "  " +
                    "(size = " + objectSummary.getSize() + 
                    ")");
        }
        listObjectsRequest.setMarker(objectListing.getNextMarker());
} while (objectListing.isTruncated());

11
2018-05-19 13:14





मैं अपने सिस्टम द्वारा उत्पन्न वस्तुओं के एक बड़े संग्रह को संसाधित कर रहा हूं; हमने संग्रहीत डेटा के प्रारूप को बदल दिया और प्रत्येक फ़ाइल को जांचने के लिए आवश्यक है, यह निर्धारित करें कि पुराने प्रारूप में कौन से थे, और उन्हें रूपांतरित करें। ऐसा करने के अन्य तरीके हैं, लेकिन यह आपके प्रश्न से संबंधित है।

    ObjectListing list = amazonS3Client.listObjects(contentBucketName, contentKeyPrefix);

    do {                

        List<S3ObjectSummary> summaries = list.getObjectSummaries();

        for (S3ObjectSummary summary : summaries) {

            String summaryKey = summary.getKey();               

            /* Retrieve object */

            /* Process it */

        }

        list = amazonS3Client.listNextBatchOfObjects(list);

    }while (list.isTruncated());

10
2018-06-12 17:09



यह कोड बहुत अंतिम बैच को संसाधित नहीं करेगा। - Bartosz Firyn


S3 ऑब्जेक्ट्स को सूचीबद्ध करने के लिए थोड़ा अधिक संक्षेप समाधान के रूप में जब उन्हें छोटा किया जा सकता है:

ListObjectsRequest request = new ListObjectsRequest().withBucketName(bucketName);
ObjectListing listing = null;

while((listing == null) || (request.getMarker() != null)) {
  listing = s3Client.listObjects(request);
  // do stuff with listing
  request.setMarker(listing.getNextMarker());
}

6
2018-03-06 21:14





जावा के लिए एडब्ल्यूएस एसडीके का उपयोग कर लिस्टिंग कुंजी

http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingJava.html

import java.io.IOException;
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.ListObjectsRequest;
import com.amazonaws.services.s3.model.ListObjectsV2Request;
import com.amazonaws.services.s3.model.ListObjectsV2Result;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;

public class ListKeys {
    private static String bucketName = "***bucket name***";

    public static void main(String[] args) throws IOException {
        AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());
        try {
            System.out.println("Listing objects");
            final ListObjectsV2Request req = new ListObjectsV2Request().withBucketName(bucketName);
            ListObjectsV2Result result;
            do {               
               result = s3client.listObjectsV2(req);

               for (S3ObjectSummary objectSummary : 
                   result.getObjectSummaries()) {
                   System.out.println(" - " + objectSummary.getKey() + "  " +
                           "(size = " + objectSummary.getSize() + 
                           ")");
               }
               System.out.println("Next Continuation Token : " + result.getNextContinuationToken());
               req.setContinuationToken(result.getNextContinuationToken());
            } while(result.isTruncated() == true ); 

         } catch (AmazonServiceException ase) {
            System.out.println("Caught an AmazonServiceException, " +
                    "which means your request made it " +
                    "to Amazon S3, but was rejected with an error response " +
                    "for some reason.");
            System.out.println("Error Message:    " + ase.getMessage());
            System.out.println("HTTP Status Code: " + ase.getStatusCode());
            System.out.println("AWS Error Code:   " + ase.getErrorCode());
            System.out.println("Error Type:       " + ase.getErrorType());
            System.out.println("Request ID:       " + ase.getRequestId());
        } catch (AmazonClientException ace) {
            System.out.println("Caught an AmazonClientException, " +
                    "which means the client encountered " +
                    "an internal error while trying to communicate" +
                    " with S3, " +
                    "such as not being able to access the network.");
            System.out.println("Error Message: " + ace.getMessage());
        }
    }
}

4
2017-10-12 17:22





ग्रे आपका समाधान अजीब था लेकिन आप एक अच्छे आदमी की तरह लग रहे हो।

AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials( ....

ObjectListing images = s3Client.listObjects(bucketName); 

List<S3ObjectSummary> list = images.getObjectSummaries();
for(S3ObjectSummary image: list) {
    S3Object obj = s3Client.getObject(bucketName, image.getKey());
    writeToFile(obj.getObjectContent());
}

3
2018-03-10 08:20



जहां तक ​​मैं इस समाधान को बता सकता हूं केवल Firs 1000 kyes / फ़ाइलों को ले जाएगा और उन्हें प्रिंट करेगा। लेकिन अधिक फ़ाइलों के लिए आगे नहीं बढ़ता है। - CruncherBigData
सच है, केवल 1000 फाइलों के लिए काम करता है। - ZZzzZZzz


मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन यह अभी भी किसी के लिए उपयोगी हो सकती है: संस्करण 2.1 पर जावा / एंड्रॉइड एसडीके सेटमैक्सकेस नामक एक विधि प्रदान करता है। इस कदर:

s3objects.setMaxKeys(arg0)

आपको शायद अब तक एक समाधान मिला है, लेकिन कृपया एक उत्तर को सही के रूप में जांचें ताकि यह भविष्य में दूसरों की मदद कर सके।


2
2017-09-26 12:11



यह उपयोगी नहीं होगा> 1,000 कुंजी हालांकि, सही? - Tejas Manohar