我正在尝试列出s3存储桶下的文件夹,问题是使用S3浏览器工具,我可以看到四个文件夹但是当我使用java / scala代码获取存储桶下的文件夹列表时,它返回只有一个文件夹。我使用简单的AWS-JAVA-SDK使用了以下代码。
val awsCreds: BasicAWSCredentials = new BasicAWSCredentials(accessKey, accessSecret)
val s3: AmazonS3 = new AmazonS3Client(awsCreds)
val listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName).withPrefix(prefix)
.withDelimiter(delimiter);
val objectListing = s3.listObjects(listObjectsRequest);
val directories = objectListing.getCommonPrefixes
println(directories.mkString(","))
它只打印一个文件夹/暂存
我还尝试了awsScala库并使用了以下代码
val bucket = s3.bucket("prod-tapp").get
val summaries=s3.ls(bucket, "/")
summaries.foreach(println(_))
但结果相同。
我可以在Windows上使用aws s3浏览器的桌面应用程序查看正确的文件夹。这是结果的屏幕截图。
有什么建议吗?
由于
答案 0 :(得分:0)
我猜你没有在前缀中包含分隔符(/
)。
如果我运行以下代码(Java,但并不重要):
public class S3Prefix {
private static final AmazonS3Client s3 = new AmazonS3Client();
public static void main(String[] args) {
Arrays.asList(null, "test1", "test1/").forEach(S3Prefix::listPrefix);
}
public static void listPrefix(String prefix) {
System.out.println("Listing prefix '" + prefix + "'");
final ListObjectsV2Result result = s3.listObjectsV2(new ListObjectsV2Request()
.withPrefix(prefix)
.withBucketName("raniz-prefix-test")
.withDelimiter("/"));
System.out.println("\tCommon prefixes");
result.getCommonPrefixes().forEach(p -> System.out.println("\t\t" + p));
System.out.println("\tKeys");
result.getObjectSummaries().forEach(s -> System.out.println("\t\t" + s.getKey()));
}
}
我得到以下输出:
Listing prefix 'null'
Common prefixes
test1/
test2/
test3/
Keys
Listing prefix 'test1'
Common prefixes
test1/
Keys
Listing prefix 'test1/'
Common prefixes
Keys
test1/
test1/bar.txt
test1/foo.txt
如您所见,如果要列出该“文件夹”的内容,则必须在前缀中包含分隔符。
答案 1 :(得分:0)
下面的代码从s3中获取所有对象(超过1000个对象)
List<S3ObjectSummary> keyList = new ArrayList<S3ObjectSummary>();
ObjectListing objects = s3.listObjects("bucket.new.test");
keyList.addAll(objects.getObjectSummaries());
while (objects.isTruncated()) {
objects = s3.listNextBatchOfObjects(objects);
keyList.addAll(objects.getObjectSummaries());
}