mal*_*ing 5 scala amazon-s3 bucket amazon-web-services
找不到关于如何在S3存储桶中列出所有文件的好解释,这让我感到沮丧。
我有大约20张图像的存储桶。我要做的就是列出它们。有人说“只是使用S3.list方法”。但是没有任何特殊的库,就没有S3.list方法。我有一个S3.get方法,但我无法正常工作。Arggh,如果有人告诉我如何简单地从S3存储桶中获取所有文件(文件名)的列表,我们将不胜感激。
val S3files = S3.get(bucketName: String, path: Option[String], prefix: Option[String], delimiter: Option[String])
Run Code Online (Sandbox Code Playgroud)
返回Future [Response]
我不知道如何使用此S3.get。列出S3存储桶中所有文件的最简单方法是什么?
答案非常感谢!
使用 Scala,您现在可能想要使用 Amazon 的官方Java SDK,它提供了以下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
}
Run Code Online (Sandbox Code Playgroud)
注意ObjectListing对象的递归:
由于存储桶中键的列表是通过批处理完成的(使用此处记录的分页系统),因此最多只能返回前 1000 个键s3Client.listObjects(bucket).getObjectSummaries.asScala.map(_.getKey)。
因此,通过请求下一页键来获取存储桶中所有键的递归调用 whileObjectListing::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()
Run Code Online (Sandbox Code Playgroud)
具有这些要求build.sbt和最新版本:
libraryDependencies ++= Seq(
"com.amazonaws" % "aws-java-sdk-bom" % "1.11.391",
"com.amazonaws" % "aws-java-sdk-s3" % "1.11.391"
)
Run Code Online (Sandbox Code Playgroud)
在此处使用库:
https://github.com/Rhinofly/play-s3
你应该能够做这样的事情:
import concurrent.ExecutionContext.Implicits._
val bucket = S3("bucketName")
val result = bucket.list
result.map {
case Left(error) => throw new Exception("Error: " + x)
case Right(list) =>
list.foreach {
case BucketItem(name, isVirtual) => //...
}
}
Run Code Online (Sandbox Code Playgroud)
您必须根据您的凭据对此进行一些调整,但示例显示了如何做到这一点。