问题描述
我正在尝试从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存在。另外,存储桶确实存在于我的云帐户中。但是,getBucketContentsV2给我以下错误消息:“指定的存储桶不存在。(服务:Amazon S3;状态代码:404;错误代码:NoSuchBucket;请求ID:xxxxx)
这是getBucketContentsV2方法,几乎与IBM云文档教程中的方法完全一样。
public static void getBucketContentsV2(AmazonS3 cosClient,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代码检索存储桶中的所有文件,并得到相同的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.getSize());
}
System.out.println();
}
解决方法
因此,我尝试使用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
可能配置错误。获取端点时,请遵循以下步骤:
- 从左侧选择端点菜单
- 选择您的弹性选项。我的是地区
- 选择您的地区
- 复制公共端点。
我的是这样的:s3.eu-de.cloud-object-storage.appdomain.cloud