对于 Scala,您现在可能想要使用 Amazon 的官方 SDK for Java,它提供了 AmazonS3::listObjects 方法:
import scala.collection.JavaConverters._
import com.amazonaws.services.s3.model.ObjectListing
def keys(bucket: String): List[String] = nextBatch(s3Client.listObjects(bucket))
private def nextBatch(listing: ObjectListing, keys: List[String] = Nil): List[String] = {
val pageKeys = listing.getObjectSummaries.asScala.map(_.getKey).toList
if (listing.isTruncated)
nextBatch(s3Client.listNextBatchOfObjects(listing), pageKeys ::: keys)
else
pageKeys ::: keys
}
注意ObjectListing 对象的递归:
由于存储桶中的键列表是按批次完成的(使用记录在 here 中的分页系统),s3Client.listObjects(bucket).getObjectSummaries.asScala.map(_.getKey) 最多只能返回前 1000 个键。
因此,当ObjectListing::isTruncated 为真时,递归调用通过请求下一页键来获取存储桶中的所有键。
如果您的存储桶很大,请注意内存问题。
s3Client 可以这样构建:
import com.amazonaws.services.s3.{AmazonS3, AmazonS3ClientBuilder}
import com.amazonaws.auth.{AWSStaticCredentialsProvider, BasicAWSCredentials}
val credentials = new BasicAWSCredentials(awsKey, awsAccessKey)
val s3Client: AmazonS3 = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials)).build()
在build.sbt 和latest version 中有这些要求:
libraryDependencies ++= Seq(
"com.amazonaws" % "aws-java-sdk-bom" % "1.11.391",
"com.amazonaws" % "aws-java-sdk-s3" % "1.11.391"
)