How to list all AWS S3 objects in a bucket using Java

后端 未结 11 1250
攒了一身酷
攒了一身酷 2020-11-30 20:34

What is the simplest way to get a list of all items within an S3 bucket using Java?

List s3objects = s3.listObjects(bucketName,prefix)         


        
相关标签:
11条回答
  • 2020-11-30 21:03

    As a slightly more concise solution to listing S3 objects when they might be truncated:

    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());
    }
    
    0 讨论(0)
  • 2020-11-30 21:11

    This worked for me.

    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;
    }
    
    0 讨论(0)
  • 2020-11-30 21:14

    Gray your solution was strange but you seem like a nice guy.

    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());
    }
    
    0 讨论(0)
  • 2020-11-30 21:16

    This is direct from AWS documentation:

    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());
    
    0 讨论(0)
  • 2020-11-30 21:16

    You don't want to list all 1000 object in your bucket at a time. A more robust solution will be to fetch a max of 10 objects at a time. You can do this with the withMaxKeys method.

    The following code creates an S3 client, fetches 10 or less objects at a time and filters based on a prefix and generates a pre-signed url for the fetched object:

    import com.amazonaws.HttpMethod;
    import com.amazonaws.SdkClientException;
    import com.amazonaws.auth.AWSStaticCredentialsProvider;
    import com.amazonaws.auth.BasicAWSCredentials;
    import com.amazonaws.regions.Regions;
    import com.amazonaws.services.s3.AmazonS3;
    import com.amazonaws.services.s3.AmazonS3ClientBuilder;
    import com.amazonaws.services.s3.model.*;
    
    import java.net.URL;
    import java.util.Date;
    
    /**
     * @author shabab
     * @since 21 Sep, 2020
     */
    public class AwsMain {
    
        static final String ACCESS_KEY = "";
        static final String SECRET = "";
        static final Regions BUCKET_REGION = Regions.DEFAULT_REGION;
        static final String BUCKET_NAME = "";
    
        public static void main(String[] args) {
            BasicAWSCredentials awsCreds = new BasicAWSCredentials(ACCESS_KEY, SECRET);
    
            try {
                final AmazonS3 s3Client = AmazonS3ClientBuilder
                        .standard()
                        .withRegion(BUCKET_REGION)
                        .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                        .build();
    
                ListObjectsV2Request req = new ListObjectsV2Request().withBucketName(BUCKET_NAME).withMaxKeys(10);
                ListObjectsV2Result result;
    
                do {
                    result = s3Client.listObjectsV2(req);
    
                    result.getObjectSummaries()
                            .stream()
                            .filter(s3ObjectSummary -> {
                                return s3ObjectSummary.getKey().contains("Market-subscriptions/")
                                        && !s3ObjectSummary.getKey().equals("Market-subscriptions/");
                            })
                            .forEach(s3ObjectSummary -> {
    
                                GeneratePresignedUrlRequest generatePresignedUrlRequest =
                                        new GeneratePresignedUrlRequest(BUCKET_NAME, s3ObjectSummary.getKey())
                                                .withMethod(HttpMethod.GET)
                                                .withExpiration(getExpirationDate());
    
                                URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
    
                                System.out.println(s3ObjectSummary.getKey() + " Pre-Signed URL: " + url.toString());
                            });
    
                    String token = result.getNextContinuationToken();
                    req.setContinuationToken(token);
    
                } while (result.isTruncated());
            } catch (SdkClientException e) {
                e.printStackTrace();
            }
    
        }
    
        private static Date getExpirationDate() {
            Date expiration = new java.util.Date();
            long expTimeMillis = expiration.getTime();
            expTimeMillis += 1000 * 60 * 60;
            expiration.setTime(expTimeMillis);
    
            return expiration;
        }
    }
    
    0 讨论(0)
  • 2020-11-30 21:18

    I know this is an old post, but this still might be usefull to anyone: The Java/Android SDK on version 2.1 provides a method called setMaxKeys. Like this:

    s3objects.setMaxKeys(arg0)
    

    You probably found a solution by now, but please check one answer as correct so that it might help others in the future.

    0 讨论(0)
提交回复
热议问题