web-dev-qa-db-ja.com

Javaを使用してバケット内のすべてのAWS S3オブジェクトをリストする方法

Javaを使用してS3バケット内のすべてのアイテムのリストを取得する最も簡単な方法は何ですか?

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

この例では、1000個のアイテムのみが返されます。

54
Ron D.

それは回避策かもしれませんが、これは私の問題を解決しました:

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

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

これは、AWSドキュメントから直接のものです。

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());
17
user3652779

システムによって生成されたオブジェクトの大規模なコレクションを処理しています。格納されたデータの形式を変更し、各ファイルを確認し、どのファイルが古い形式であるかを判断し、変換する必要がありました。これを行う方法は他にもありますが、これはあなたの質問に関連しています。

    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年以降にこれを読んでいる人のために。 2つの新しいpagination-hustle-free APIが利用可能です:Java 1.x用のAWS SDKに1つ、2.xにもう1つ。

1.x

新しいAPI in Java SDKがあり、ページネーションを処理せずにS3バケット内のオブジェクトを反復処理できます。

_AmazonS3 s3 = AmazonS3ClientBuilder.standard().build();

S3Objects.inBucket(s3, "the-bucket").forEach((S3ObjectSummary objectSummary) -> {
    // TODO: Consume `objectSummary` the way you need
    System.out.println(objectSummary.key);
});
_

この反復は怠zyです:

_S3ObjectSummary_ sのリストは、必要に応じて、一度に1ページずつ遅延してフェッチされます。ページのサイズは withBatchSize(int) メソッドで制御できます。

2.x

APIが変更されたため、ここにSDK 2.xバージョンがあります。

_S3Client client = S3Client.builder().region(Region.US_EAST_1).build();
ListObjectsV2Request request = ListObjectsV2Request.builder().bucket("the-bucket").prefix("the-prefix").build();
ListObjectsV2Iterable response = client.listObjectsV2Paginator(request);

for (ListObjectsV2Response page : response) {
    page.contents().forEach((S3Object object) -> {
        // TODO: Consume `object` the way you need
        System.out.println(object.key());
    });
}
_

_ListObjectsV2Iterable_ も怠zyです:

操作が呼び出されると、このクラスのインスタンスが返されます。この時点では、サービス呼び出しはまだ行われていないため、リクエストが有効であるという保証はありません。 iterableを反復処理すると、SDKは、ページがなくなるか反復処理が停止するまでサービス呼び出しを行うことで、応答ページの遅延ロードを開始します。リクエストにエラーがある場合、イテレート可能オブジェクトを反復処理し始めた後にのみエラーが表示されます。

7
madhead

AWS SDK for Javaを使用してキーを一覧表示する

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());
        }
    }
}
7

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());
}
7
pedorro

灰色のソリューションは奇妙でしたが、あなたはナイスガイのように見えます。

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());
}
4
jon

私はこれが古い投稿であることを知っていますが、これはまだ誰にとっても有用かもしれません:バージョン2.1のJava/Android SDKはsetMaxKeysと呼ばれるメソッドを提供します。このような:

s3objects.setMaxKeys(arg0)

おそらく今までに解決策を見つけたと思いますが、将来的に他の人に役立つように、1つの答えを正しいものとしてチェックしてください。

3
Vini.g.fer

これは私のために働いた。

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;
}
3
user2798227