Bienvenido a nuestro espacio, en este lugar hallarás la solucíon de lo que necesitas.
Solución:
Con Scala, es posible que desee utilizar el SDK oficial de Amazon para Java, que proporciona la AmazonS3::listObjects
método:
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
Nótese la recursividad en ObjectListing
objetos:
Desde el listado de keys en un cubo se realiza por lotes (usando un sistema de paginación como se documenta aquí), solo hasta los primeros 1000 keys sería devuelto por s3Client.listObjects(bucket).getObjectSummaries.asScala.map(_.getKey)
.
Por lo tanto, la llamada recursiva para obtener todos keys en un balde pidiendo la siguiente página de keys mientras ObjectListing::isTruncated
es true.
Sin embargo, tenga cuidado con los problemas de memoria si su cubo es enorme.
s3Client
se puede construir como tal:
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()
con estos requisitos en build.sbt
y la última versión:
libraryDependencies ++= Seq(
"com.amazonaws" % "aws-java-sdk-bom" % "1.11.391",
"com.amazonaws" % "aws-java-sdk-s3" % "1.11.391"
)
Usando la biblioteca aquí:
https://github.com/Rhinofly/play-s3
Deberías poder hacer algo como esto:
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) => //...
Tendrá que modificar esto un poco con respecto a sus credenciales, pero los ejemplos muestran cómo hacerlo.
def listS3Files() = Action
Await.result(S3("bucketName").list, 15 seconds).fold(
error =>
Logger.error("Error")
Status(INTERNAL_SERVER_ERROR)
,
success =>
Ok(success.seq.toString())
)
Aquí está mi solución de trabajo. Gracias a @cmbaxter
Eres capaz de añadir valor a nuestra información añadiendo tu veteranía en las observaciones.