Saltar al contenido

Listar archivos en S3

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *