有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java服务:amazons3;状态代码:404;错误代码:NoSuchBucket;从IBM云对象存储获取文件时遇到问题

我试图从IBM云对象存储中的存储桶中获取文件。为此,我首先尝试读取一个桶中所有可用的文件

private static List<String> listBuckets(AmazonS3 cosClient) {
    final List<Bucket> bucketList = cosClient.listBuckets();
    List<String> bucketNames = new ArrayList<String>();
    for (final Bucket bucket : bucketList) {
        bucketNames.add(bucket.getName());
    }
    return bucketNames;
}

public InputStream getCOSFile(AmazonS3 cosClient, String bucketName, String objectName){
    List<String> bucketNames = listBuckets(cosClient);
    if (bucketNames.contains(bucketName)){
        LOGGER.info(bucketName+" exists");
        getBucketContentsV2(cosClient, bucketName, 2);
       }

在这里,我从if块中得到消息bucketName exists。而且,我的云账户中确实存在这个桶。但是,getBucketContentsV2给了我这个错误消息:“指定的bucket不存在。(服务:Amazon S3;状态代码:404;错误代码:NoSuchBucket;请求ID:xxxxx)

下面是getBucketContentsV2方法,与IBM cloud doc教程中的方法几乎完全相同

public static void getBucketContentsV2(AmazonS3 cosClient, String bucketName, int maxKeys) {
    System.out.printf("Retrieving bucket contents (V2) from: %s\n", bucketName);

    boolean moreResults = true;
    String nextToken = "";

    while (moreResults) {
        ListObjectsV2Request request = new ListObjectsV2Request()
                .withBucketName(bucketName)
                .withMaxKeys(maxKeys)
                .withContinuationToken(nextToken);

        ListObjectsV2Result result = cosClient.listObjectsV2(request);
        for(S3ObjectSummary objectSummary : result.getObjectSummaries()) {
            System.out.printf("Item: %s (%s bytes)\n", objectSummary.getKey(), objectSummary.getSize());
        }

        if (result.isTruncated()) {
            nextToken = result.getNextContinuationToken();
            System.out.println("...More results in next batch!\n");
        }
        else {
            nextToken = "";
            moreResults = false;
        }
    }
    System.out.println("...No more results!");
}

我还尝试用文档中的V1代码检索bucket中的所有文件,并得到相同的NoSuchBucket错误

下面是该方法的实现:

public static void listBuckets(AmazonS3 cosClient, String bucketName) {
    System.out.printf("Retrieving bucket contents from: %s\n", bucketName);
    ObjectListing objectListing = cosClient.listObjects(new ListObjectsRequest().withBucketName(bucketName));
    for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
        System.out.printf("Item: %s (%s bytes)\n", objectSummary.getKey(), objectSummary.getSize());
    }
    System.out.println();
}

共 (1) 个答案

  1. # 1 楼答案

    所以我尝试了this代码来复制错误。我能列出桶里的物品。我的第一个客人可能是配置错误

    String bucketName = "<BUCKET_NAME>";  // eg my-unique-bucket-name
    String newBucketName = "<NEW_BUCKET_NAME>"; // eg my-other-unique-bucket-name
    String apiKey = "<API_KEY>"; // eg "W00YiRnLW4k3fTjMB-oiB-2ySfTrFBIQQWanc P3byk"
    String serviceInstanceId = "<SERVICE_INSTANCE_ID"; // eg "crn:v1:bluemix:public:cloud-object-storage:global:a/3bf0d9003abfb5d29761c3e97696b71c:d6f04d83-6c4f-4a62-a165-696756d63903::"
    String endpointUrl = "https://s3.us-south.cloud-object-storage.appdomain.cloud"; // this could be any service endpoint
    

    可能是endpointUrl配置错误。获取端点时,请执行以下步骤:

    1. 从左侧选择端点菜单
    2. 选择您的弹性选项。我的是地区
    3. 选择您的地区
    4. 复制公共端点

    我的是这样的:s3.eu-de.cloud-object-storage.appdomain.cloud