scala 列出S3上的文件

f5emj3cl  于 2022-12-18  发布在  Scala
关注(0)|答案(4)|浏览(179)

找不到任何关于如何列出S3存储桶中所有文件的好的解释,这让我很沮丧。
我有一个大约有20张图片的桶。我想做的就是列出它们。有人说“只要使用S3.list-method”。但是没有任何特殊的库就没有S3.list-method。我有一个S3.get-method,我不去工作。如果有人告诉我如何简单地从S3桶中获得所有文件(文件名)的列表,我会很感激。

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

返回一个未来[响应]
我不知道如何使用这个s3. get。列出我的S3桶中的所有文件的最简单的方法是什么?
非常感谢您的回答!

rjee0c15

rjee0c151#

在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对象上的递归:
由于bucket中键的列表是通过批处理完成的(使用这里介绍的分页系统),因此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"
)

tyg4sfes

tyg4sfes2#

在此处使用库:
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) => //...
    }
}

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

8wtpewkr

8wtpewkr3#

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

vuktfyat

vuktfyat4#

val listObjectsRequest: ListObjectsV2Request = new ListObjectsV2Request()
      .withBucketName(bucketName)
      .withPrefix({path of directory})
      .withDelimiter("/")

    val listOfObejct: List[String] = amazonS3.listObjectsV2(listObjectsRequest)
      .getCommonPrefixes
      .asScala
      .toList

相关问题