S3 java API未正确列出文件夹。

时间:2016-12-28 08:31:39

标签: java scala amazon-s3 aws-sdk

我正在尝试列出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浏览器的桌面应用程序查看正确的文件夹。这是结果的屏幕截图。 enter image description here

有什么建议吗?

由于

2 个答案:

答案 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());
}