java - 列出 aws 存储桶中的对象

标签 java amazon-web-services amazon-s3

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

Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 301, AWS Service: Amazon S3, AWS Request ID: 758A7CBF1A29FD74, AWS Error Code: PermanentRedirect, AWS Error Message: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint., 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在亚马逊的网站上。

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

最佳答案

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

要调用上述柯里化(Currying)的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 接近的那样

关于java - 列出 aws 存储桶中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21506270/

相关文章:

amazon-web-services - 如何从 secret 管理器中获取私钥?

amazon-web-services - 如何使用配置/高级查询查询 EventBridge 规则?

java - 有没有办法摆脱我得到的这个空指针异常?

java - 如何从多个服务器获取与 Spring Security 和 Spring Session 相同的 session

java - 支柱 2 s :include tag not working for header jspf file

amazon-web-services - 使用Terraform对S3进行SSE加密

asp.net - 从 ASP.NET Core Web API 将多 GB 文件流式传输到 AWS S3

java - 如何使 java.util.Date 线程安全

java - 亚马逊产品广告 API - 使用 Java/SOAP 批量 itemLookup 出现 503 错误

reactjs - 使用 HTML img 标签时 Cloudfront 连续缓存未命中,但通过 Postman/浏览器请求获得缓存命中