列出 aws 存储桶中的对象

Posted

技术标签:

【中文标题】列出 aws 存储桶中的对象【英文标题】:listing objects in aws bucket 【发布时间】:2014-02-02 02:19:43 【问题描述】:

我试图打印存储桶中的所有对象,但出现错误。

线程“main”com.amazonaws.services.s3.model.AmazonS3Exception 中的异常:状态代码:301,AWS 服务:Amazon S3,AWS 请求 ID:758A7CBF1A29FD74,AWS 错误代码:PermanentRedirect,AWS 错误消息:存储桶您尝试访问的地址必须使用指定的端点进行寻址。请将所有未来的请求发送到此端点。,S3

目前我只有以下代码:

public class S3Download 

    /**
     * @param args
     */
    public static void main(String[] args) 
        AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());
        Region usWest2 = Region.getRegion(Regions.US_WEST_2);
        s3.setRegion(usWest2);
        String bucketName = "apireleasecandidate1";

        ListObjectsRequest listObjectRequest = new ListObjectsRequest().withBucketName(bucketName);
        ObjectListing objectListing;

        do
            objectListing = s3.listObjects(listObjectRequest);
            for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries())
                System.out.println(" - " + objectSummary.getKey() + " " + "(size = " +
            objectSummary.getSize() + ")");
            
            listObjectRequest.setMarker(objectListing.getNextMarker());
        while(objectListing.isTruncated());
    


我在亚马逊网站上找到了this solution。

有人知道我错过了什么吗?

【问题讨论】:

您需要基于 Java 的解决方案吗? 是的,我需要一个基于 java 的解决方案 看看s3.jcabi.com 【参考方案1】:

对于 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))

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

例如

map(s3, bucket, prefix)(s => println(s))

将打印所有文件

val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize))

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

val totalSize = map(s3, "bucket", "prefix")(s => s.getSize).sum

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

您可以将map() 与许多其他功能结合使用,就像您通常通过Monads in Functional Programming 实现的那样

【讨论】:

【参考方案2】:

您的存储桶“apireleasecandidate1”似乎不在 us-west-1 区域。我认为它在美国经典地区。您应该修改代码以删除 setRegion() 调用。

【讨论】:

以上是关于列出 aws 存储桶中的对象的主要内容,如果未能解决你的问题,请参考以下文章

AWS S3策略限制用户仅列出存储桶中的某些文件夹

列出具有公共读取权限的 S3 对象(在私有存储桶中)

如何删除/计算 s3 存储桶中的对象?

为啥我可以在未经许可的情况下删除/列出 S3 存储桶中的对象

默认情况下,如何将 AWS S3 存储桶中的所有对象设为公开?

如何强制删除 S3 存储桶中的所有对象版本,然后最终使用 aws-sdk-go 删除整个存储桶?