【问题标题】:List files on S3列出 S3 上的文件
【发布时间】:2013-06-24 21:21:59
【问题描述】:

我对如何列出 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 存储桶中所有文件的最简单方法是什么?

非常感谢您的回答!

【问题讨论】:

标签: scala amazon-web-services amazon-s3 bucket


【解决方案1】:

在这里使用库:

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

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

【讨论】:

    【解决方案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

    【讨论】:

    • 我需要导入什么才能将Action 纳入范围?这很难用谷歌搜索。
    【解决方案3】:

    对于 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.sbtlatest version 中有这些要求:

    libraryDependencies ++= Seq(
      "com.amazonaws" % "aws-java-sdk-bom" % "1.11.391",
      "com.amazonaws" % "aws-java-sdk-s3"  % "1.11.391"
    )
    

    【讨论】:

    • 我非常感谢您的回答。感谢您发布此内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2014-07-01
    • 2020-01-24
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多