当前位置: 首页 > 知识库问答 >
问题:

Java:如何打印s3 bucket的内容

狄心水
2023-03-14

我正在使用jdk 11和虚拟主机样式访问(AWS SDK for Java version 2)在AWS s3 bucket中创建/访问对象,如下所示:

https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/examples-s3-objects.html#list-object

虽然我能够在指定的bucket中创建对象,但我无法打印bucket中的内容/对象列表,尽管在我检查权限时,每个人都有权查看bucket中的对象。错误消息为:

software.amazon.awssdk.services.s3.model.NoSuchKeyException: The specified key does not exist. (Service: S3, Status Code: 404

这是s3client的创建方式:

    adapterSmsS3Client = S3Client.builder()
        .region(Region.US_WEST_2)
        .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(ACCESS_KEY,SECRET_KEY)))
        .endpointOverride(URI.create(BASE_URL))
        .build();

这就是我打印列表的方式:

public static void listBucketObjects(  S3Client s3, String bucketName ) {
ListBucketsResponse res1 =  s3.listBuckets();

  ListObjectsRequest listObjects = ListObjectsRequest
          .builder()
          .bucket(BUCKET_NAME)
          .build();

  ListObjectsResponse res = s3.listObjects(listObjects);
  List<S3Object> objects = res.contents();

  for (ListIterator iterVals = objects.listIterator(); iterVals.hasNext(); ) {
    S3Object myValue = (S3Object) iterVals.next();
    System.out.print("\n The name of the key is " + myValue.key());
    System.out.print("\n The object is " + calKb(myValue.size()) + " KBs");
    System.out.print("\n The owner is " + myValue.owner());
  }

}

BUCKET\u NAME是s3上BUCKET的名称(不是任何URL)

虽然,我想提一下,如果我使用路径样式请求(AWSSDKJava版本1),如下:

https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3-objects.html

我可以从同一个存储桶打印内容。但是我们不打算走那条路。

关于为什么我得到“密钥不存在”错误或潜在解决方案的任何见解?

共有1个答案

尤研
2023-03-14

如果您在权限方面有任何问题,您将获得403个禁止权限;不是404 NoSuchKey。

桶中对象的名称是什么?我的猜测是,您有一些特殊字符或url编码字符导致了问题。看见https://aws.amazon.com/premiumsupport/knowledge-center/404-error-nosuchkey-s3/?nc1=h_ls了解更多详细信息。

我建议您使用listObjectsV2而不是V1。

 类似资料:
  • 我正在尝试将集合的内容打印到Spark控制台。 我有一个类型: 我使用命令: 但这是打印的: res1:组织。阿帕奇。火花rdd。RDD[单位]=MappedRDD[4]位于map at:19 如何将RDD写入控制台或保存到磁盘,以便查看其内容?

  • 问题内容: 我有一个带有两个标签的图片。我需要打印这些内容。请帮帮我。我如何仅打印此内容,因为我的组件也不同,但是我只需要打印 此内容 。 谢谢。 问题答案: 这是打印任何Swing组件的示例。

  • 问题内容: 我有一个涉及httprequest的错误,有时会发生,所以我想记录HttpGet和HttpPost请求的内容。 所以,让我们说,我这样创建HttpGet: 这是我想要的字符串表示形式: 对于发布请求,我还想获取内容字符串。 在Java for Android中最简单的方法是什么? 问题答案: 您可以使用以下命令打印请求类型: 您可以按此处所述打印所有标题: 要打印所有请求参数,请使用以

  • 如何将的内容打印到屏幕? 实现以下< code >运算符的解决方案 以下是我目前所拥有的,没有单独的功能:

  • 在python中,我们可以通过使用< code >对象来检查实例的内部。__dict__ 我们如何在或中实现这一点?

  • 对于Android来说,在java中最简单的方法是什么?