6

我对如何列出 S3 存储桶中的所有文件没有找到任何好的解释感到沮丧。

我有这个桶,上面有大约 20 张图片。我想做的就是列出它们。有人说“只使用 S3.list 方法”。但是没有任何特殊的库就没有 S3.list-method。我有一个 S3.get-method,我没有开始工作。Arggh,如果有人告诉我如何简单地从 S3 存储桶中获取所有文件(文件名)的列表,我将不胜感激。

val S3files = S3.get(bucketName: String, path: Option[String], prefix: Option[String], delimiter: Option[String])

返回一个未来[响应]

我不知道如何使用这个 S3.get。列出我的 S3 存储桶中所有文件的最简单方法是什么?

非常感谢答案!

4

3 回答 3

6

使用 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
}

注意对象的递归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()

具有这些要求build.sbt最新版本

libraryDependencies ++= Seq(
  "com.amazonaws" % "aws-java-sdk-bom" % "1.11.391",
  "com.amazonaws" % "aws-java-sdk-s3"  % "1.11.391"
)
于 2018-08-27T14:06:34.790 回答
5

在此处使用库:

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) => //...
    }
}

您必须根据您的凭据对此进行一些调整,但示例显示了如何做到这一点。

于 2013-06-27T12:01:27.090 回答
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

于 2013-06-27T13:13:43.017 回答