我通过AWS S3管理控制台在S3中创建了一个层次结构。如果我运行以下代码列出存储桶:
AmazonS3 s3 = new AmazonS3Client(CRED);
ListObjectsRequest lor = new ListObjectsRequest()
.withBucketName("myBucket")
.withPrefix("code/");
ObjectListing objectListing = s3.listObjects(lor);
for (S3ObjectSummary summary: objectListing.getObjectSummaries()) {
System.out.println(summary.getKey());
}
我明白了:
code/
code/03000000-0001-0000-0000-000000000000/
code/03000000-0001-0000-0000-000000000000/special.js
code/03000000-0001-0000-0000-000000000000/test.js
code/03000000-0002-0000-0000-000000000000/
这正是我所期待的。如果我添加一个分隔符,所以我只在“代码/”下直接列出内容,现在我没有得到任何子目录。
将上面的行(在末尾添加withDelimiter())更改为:
ListObjectsRequest lor = new ListObjectsRequest().withBucketName("myBucket")
.withPrefix("code/")
.withDelimiter("/");
我现在只得到:
code/
我知道S3没有“目录”,而是分隔键,但这种行为看起来很奇怪?我如何列出仅在“代码”下方的内容?
答案 0 :(得分:28)
如果您拥有没有内容的密钥,S3会将其视为“通用前缀”:
public List getCommonPrefixes()
获取此对象列表中包含的公共前缀。共同 只有在原始分区中指定了分隔符时才会出现前缀 请求。
每个公共前缀表示S3存储桶中的一组密钥 已被浓缩并从对象汇总结果中省略。这个 允许应用程序按层次组织和浏览其密钥, 类似于文件系统如何将文件组织到目录中。
例如,考虑包含以下键的存储桶:
“富/酒吧/ baz” 的
为 “foo /酒吧/庆典”
为 “foo /酒吧/砰”
“foo / boo”如果使用prefix =“foo /”和delimiter =“/”on调用listObjects 这个桶,返回的S3ObjectListing将包含一个条目 公共前缀列表(“foo / bar /”)并且没有任何键开头 该公共前缀将包含在对象摘要列表中。
返回:此对象列表中包含的公共前缀列表, 如果没有找到共同的前缀,则可能是一个空列表。
答案 1 :(得分:1)
您可以指定列出存储桶的任何目录层次结构。将prefix设置为“”或“ /”时,表示存储桶的第一级目录。设置特定的子目录时,将显示该子目录的键列表。
参考Charles Menguy's answer in 'Amazon S3 listing “directories”',并添加了一些修改。
public List<String> listKeysInBucket(String bucketName, String prefix) {
Boolean isTopLevel = false;
String delimiter = "/";
if(prefix == "" || prefix == "/") {
isTopLevel = true;
}
if (!prefix.endsWith(delimiter)) {
prefix += delimiter;
}
ListObjectsRequest listObjectsRequest = null;
if (isTopLevel) {
listObjectsRequest =
new ListObjectsRequest().withBucketName(bucketName).withDelimiter(delimiter);
} else {
listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix)
.withDelimiter(delimiter);
}
ObjectListing objects = s3Client.listObjects(listObjectsRequest);
return objects.getCommonPrefixes();
}
答案 2 :(得分:0)
This below code worked for me to list all directories in s3.
private static String bucket_name = "";
private static String secret_key = "";
private static String access_key = "";
private static String Regions region = Regions.SELECT_REGION;
public static void main(String[] args) {
System.out.println(listKeysInBucket(bucket_name, "/"));
}
public static List<String> listKeysInBucket(String bucketName, String prefix) {
boolean isTopLevel = false;
String delimiter = "/";
if (prefix.equals("") || prefix.equals(delimiter)) {
isTopLevel = true;
}
if (!prefix.endsWith(delimiter)) {
prefix += delimiter;
}
ListObjectsRequest listObjectsRequest = null;
if (isTopLevel) {
listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withDelimiter(delimiter);
} else {
listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix)
.withDelimiter(delimiter);
}
ObjectListing objects = s3Client().listObjects(listObjectsRequest);
return objects.getCommonPrefixes();
}
public static AmazonS3 s3Client() {
AWSCredentials s3Configs = new BasicAWSCredentials(access_key,secret_key);
return AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(s3Configs)).withRegion(region )
.build();
}