amazon s3只为一个存储桶返回1000个条目,而为另一个存储桶返回所有条目(使用java sdk)?

我使用下面提到的代码来获取s3存储桶中所有文件名的列表。 s3中有两个桶。 对于下面的一个桶代码返回所有文件名(超过1000),但相同的代码仅返回另一个桶的1000个文件名。 我只是不知道发生了什么。 为什么相同的代码运行一个桶而不是其他?

我的桶也有层次结构文件夹/ filename.jpg。

ObjectListing objects = s3.listObjects("bucket.new.test"); do { for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) { String key = objectSummary.getKey(); System.out.println(key); } objects = s3.listNextBatchOfObjects(objects); } while (objects.isTruncated()); 

改善@ Abhishek自己的答案。 此代码略短。 还修复了变量名称。

 List keyList = new ArrayList(); ObjectListing objects = s3.listObjects("bucket.new.test"); keyList.addAll(objects.getObjectSummaries()); while (objects.isTruncated()) { objects = s3.listNextBatchOfObjects(objects); keyList.addAll(objects.getObjectSummaries()); } 

对于Scala开发人员,这里使用官方AWS SDK for Java执行完整扫描和 AmazonS3存储桶内容映射的递归函数

 import com.amazonaws.services.s3.AmazonS3Client import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest} import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala} def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = { def scan(acc:List[T], listing:ObjectListing): List[T] = { val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries()) val mapped = (for (summary <- summaries) yield f(summary)).toList if (!listing.isTruncated) mapped.toList else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing)) } scan(List(), s3.listObjects(bucket, prefix)) } 

要调用上面的curried map()函数,只需在第一个参数列表中传递已构造的(并且已正确初始化的)AmazonS3Client对象(请参阅官方AWS SDK for Java API参考 ),存储桶名称和前缀名称。 还要传递要应用的函数f()以映射第二个参数列表中的每个对象摘要。

例如

 val keyOwnerTuples = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner)) 

将返回该bucket /前缀中的(key, owner)元组的完整列表

要么

 map(s3, "bucket", "prefix")(s => println(s)) 

正如Monads在函数式编程中通常所采用的那样

我刚刚更改了上面的代码,使用addAll而不是使用for循环逐个添加对象,它对我有用

 List keyList = new ArrayList(); ObjectListing object = s3.listObjects("bucket.new.test"); keyList = object.getObjectSummaries(); object = s3.listNextBatchOfObjects(object); while (object.isTruncated()){ keyList.addAll(current.getObjectSummaries()); object = s3.listNextBatchOfObjects(current); } keyList.addAll(object.getObjectSummaries()); 

之后,您可以简单地使用列表keyList上的任何迭代器。

如果你想获得所有对象(超过1000个密钥),你需要发送另一个带有最后一个密钥的数据包到S3。 这是代码。

 private static String lastKey = ""; private static String preLastKey = ""; ... do{ preLastKey = lastKey; AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider()); String bucketName = "bucketname"; ListObjectsRequest lstRQ = new ListObjectsRequest().withBucketName(bucketName).withPrefix(""); lstRQ.setMarker(lastKey); ObjectListing objectListing = s3.listObjects(lstRQ); // loop and get file on S3 for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { // get oject and do something..... } }while(lastKey != preLastKey);