AWS S3 - 列出没有前缀的文件夹中的所有对象

Mar*_*arz 9 java amazon-s3 amazon-web-services

我在检索AWS S3中文件夹内的所有对象(文件名)时遇到问题.这是我的代码:

ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
            .withBucketName(bucket)
            .withPrefix(folderName + "/")
            .withMarker(folderName + "/")

    ObjectListing objectListing = amazonWebService.s3.listObjects(listObjectsRequest)

    for (S3ObjectSummary summary : objectListing.getObjectSummaries()) {
        print summary.getKey()
    }
Run Code Online (Sandbox Code Playgroud)

它返回正确的对象但是带有前缀,例如foldename/filename

我知道我可以使用java或substring来排除前缀,但我只想知道AWS SDK中是否有方法.

Dan*_*SFT 7

那没有.Linked是所有可用方法的列表.这背后的原因是S3设计.S3没有"子文件夹".相反,它只是一个文件列表,其中文件名是"前缀"加上您想要的文件名.GUI显示与存储在"文件夹"中的窗口类似的数据,但S3中没有文件夹逻辑.

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/S3ObjectSummary.html

最好的办法是用"/"拆分并取出数组中的最后一个对象.


Pao*_*tti 5

对于 Scala 开发人员来说,这里是使用官方AWS SDK for Java执行完整扫描并映射AmazonS3 存储桶内容的递归函数

import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest}
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}

def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = {

  def scan(acc:List[T], listing:ObjectListing): List[T] = {
    val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries())
    val mapped = (for (summary <- summaries) yield f(summary)).toList

    if (!listing.isTruncated) mapped.toList
    else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing))
  }

  scan(List(), s3.listObjects(bucket, prefix))
}
Run Code Online (Sandbox Code Playgroud)

要调用上述柯里化map()函数,只需在第一个参数列表中传递已构造(并正确初始化)的 AmazonS3Client 对象(请参阅官方AWS SDK for Java API Reference)、存储桶名称和前缀名称。f()还要传递要应用于映射第二个参数列表中的每个对象摘要的函数。

例如

map(s3, bucket, prefix) { s => println(s.getKey.split("/")(1)) }
Run Code Online (Sandbox Code Playgroud)

将打印所有文件名(不带前缀)

val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize))
Run Code Online (Sandbox Code Playgroud)

(key, owner, size)将返回该存储桶/前缀中元组的完整列表

val totalSize = map(s3, "bucket", "prefix")(s => s.getSize).sum
Run Code Online (Sandbox Code Playgroud)

将返回其内容的总大小(请注意sum()在表达式末尾应用的附加折叠函数;-)

您可以与许多其他函数结合使用,就像在函数式编程中map()通常使用Monad 那样