由于没有找到关于如何列出S3存储桶中所有文件的任何好解释,我感到很沮丧。
我有这个桶,大约有20张图片。我想要做的就是列出它们。有人说“只需使用S3.list-method”。但是没有任何特殊的库,就没有S3.list-method。 我有一个S3.get-method,我无法工作。如果有人告诉我如何从S3存储桶中获取所有文件(文件名)的列表,Arggh会很感激。
val S3files = S3.get(bucketName: String, path: Option[String], prefix: Option[String], delimiter: Option[String])
返回Future [Response]
我不知道如何使用这个S3.get。 列出S3存储桶中所有文件的最简单方法是什么?
非常感谢!
答案 0 :(得分:4)
在这里使用图书馆:
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) => //...
}
}
您需要对您的凭据进行一些调整,但示例显示了如何执行此操作。
答案 1 :(得分:2)
def listS3Files() = Action {
Await.result(S3("bucketName").list, 15 seconds).fold(
{ error => {
Logger.error("Error")
Status(INTERNAL_SERVER_ERROR)
}},
success => {
Ok(success.seq.toString())
}
)
}
这是我的工作解决方案。感谢@cmbaxter
答案 2 :(得分:2)
使用Scala,您现在可能要使用提供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"
)