Soru Java kullanarak bir kovadaki tüm AWS S3 nesnelerini listeleme


Java kullanarak bir S3 paketindeki tüm öğelerin listesini almanın en kolay yolu nedir?

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

Bu örnek sadece 1000 öğeyi döndürür.


44
2017-11-06 13:24


Menşei


Soru, kullandığınız S3 paketini ve sürümünü sağlamak için düzenlenmelidir. - Gray
Bu benim için çalıştı: codeflex.co/get-list-of-objects-from-s3-directory - machine_messiah
1000 dosya sınırını nasıl kodlandırabilirler. Bu çok hataya eğilimli, şimdi üretimimi düzeltmem gerekiyor. - Przemek


Cevaplar:


Bu bir çözüm olabilir ama bu benim problemimi çözdü:

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



Bana bir geçici çözüm gibi görünmüyor, bu API'nın kullanım amacı gibi görünüyor. - Joachim Sauer
Birisi önerdi bu ilgilenirseniz cevabınızı düzenleyin - Benjol
s3.listObjects, listeleme başına varsayılan 1000 öğe sınırına sahiptir, bu nedenle @JoachimSauer, bu API'nin kullanım amacının bu olduğunu belirtti - Fgblanch
Aynı zamanda sürüm bilgisi almak mümkün mü? - gonzobrains
Bu tehlikeli varsayımı yapar List tarafından döndürülen getObjectSummaries() değişebilir. - Steve Kuo


Bu doğrudan AWS belgelerinden:

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





Sistemimiz tarafından üretilen geniş bir nesne koleksiyonunu işliyorum; Saklanan verilerin formatını değiştirdik ve her dosyayı kontrol etmek, hangisinin eski formatta olduğunu belirlemek ve bunları dönüştürmek için ihtiyaç duyduk. Bunu yapmanın başka yolları var, ama bu sizin sorunuzla ilgilidir.

    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



Bu kod son parti işlenmeyecek. - Bartosz Firyn


Kesilebilecekleri zaman S3 nesnelerini listelemek için biraz daha özlü bir çözüm olarak:

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





Java için AWS SDK Kullanarak Listeleme Tuşları

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





Gri çözümün garipti ama iyi birine benziyorsun.

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



Bu çözümü anlatabildiğim kadarıyla sadece 1000 ky / adet köknarları alıp yazdıracağım. Ancak daha fazla dosya için daha fazla yinelenmez. - CruncherBigData
true, sadece 1000 dosya için çalışır. - ZZzzZZzz


Bu eski bir yazı olduğunu biliyorum, ancak bu hala herkes için yararlı olabilir: 2.1 sürümünde Java / Android SDK setMaxKeys adlı bir yöntem sağlar. Bunun gibi:

s3objects.setMaxKeys(arg0)

Muhtemelen şimdiye kadar bir çözüm buldunuz, ancak lütfen bir cevabı doğru olarak kontrol edin, böylece gelecekte başkalarına yardımcı olabilir.


2
2017-09-26 12:11



Bu, işe yarar> 1000 anahtar değil, değil mi? - Tejas Manohar


Bu benim için çalıştı.

Thread thread = new Thread(new Runnable(){
    @Override
    public void run() {
        try {
            List<String> listing = getObjectNamesForBucket(bucket, s3Client);
            Log.e(TAG, "listing "+ listing);

        }
        catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, "Exception found while listing "+ e);
        }
    }
});

thread.start();



  private List<String> getObjectNamesForBucket(String bucket, AmazonS3 s3Client) {
        ObjectListing objects=s3Client.listObjects(bucket);
        List<String> objectNames=new ArrayList<String>(objects.getObjectSummaries().size());
        Iterator<S3ObjectSummary> oIter=objects.getObjectSummaries().iterator();
        while (oIter.hasNext()) {
            objectNames.add(oIter.next().getKey());
        }
        while (objects.isTruncated()) {
            objects=s3Client.listNextBatchOfObjects(objects);
            oIter=objects.getObjectSummaries().iterator();
            while (oIter.hasNext()) {
                objectNames.add(oIter.next().getKey());
            }
        }
        return objectNames;
}

2
2018-03-27 04:56





Bunu dene

public void getObjectList(){
        System.out.println("Listing objects");
        ObjectListing objectListing = s3.listObjects(new ListObjectsRequest()
                .withBucketName(bucketName)
                .withPrefix("ads"));
        for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
            System.out.println(" - " + objectSummary.getKey() + "  " +
                               "(size = " + objectSummary.getSize() + ")");
        }
    }

Kovadaki tüm nesneleri belirli bir önekle yapabilirsiniz.


-2
2018-03-29 04:55