开发者社区> 问答> 正文

OSS对象存储api无法列出bucket下的所有object

OSS对象存储api无法列出bucket下的所有object,而且有些情况下会把文件夹类型的object也列出。
关键代码如下:
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
ObjectListing listing = client.listObjects(listObjectsRequest);
                for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
                        。。。
                }
测试的时候用了两个bucket,一个bucket显示正常,另一个bucket则不仅没法列出某些文件,而且还会夹杂文件夹,按照api的教学例子上面代码正常情况下运行后应该是不会出现文件夹的。



展开
收起
dgglance 2016-01-15 10:47:15 7848 0
2 条回答
写回答
取消 提交回答
  • 回 1楼baiyubin的帖子
    太感谢了,完美解答了我的疑惑

    -------------------------

    回 1楼baiyubin的帖子
    能帮我讲下,都是默认情况下,为什么有的bucket里不会把文件夹列出来,为什么有的却会列出。我现在为了让它不列出文件夹采用了如下手段:
    for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {// 获取该目录下所有文件
            if (!objectSummary.getKey().endsWith("/"))// 去掉以“/”结尾的object,来过滤掉文件夹
            System.out.println(objectSummary.getKey());
            }
    有更好的方法吗,为什么会发生这种事?
    2016-01-15 12:29:29
    赞同 展开评论 打赏
  • Alibaba Cloud OSS SDK/Tools Developer
    ReOSS对象存储api无法列出bucket下的所有object
    ObjectListing listObjects(ListObjectsRequest listObjectsRequest)
    ListObjectsRequest中有四个参数可以设置:  
    prefix限定返回的object key必须以prefix作为前缀。使用listObjectsRequest.setPrefix设置。
    maker用户设定结果从marker之后按字母排序的第一个开始返回。使用listObjectsRequest.setMarker设置。
    maxKeys用于限定此次返回object的最大数,如果不设定,默认为100。使用listObjectsRequest.setMaxKeys设置。
    delimiter是一个用于对Object名字进行分组的字符。使用listObjectsRequest.setDelimiter设置。

    上面4个参数都是有默认值的,如maxKeys默认每次listObjects返回100个object。
    如果需要获取全部object,需要如下的方式分页显示:
        ObjectListing objectListing = null;
        String nextMarker = null;
        final int maxKeys = 30;
        
        do {
            System.out.println("Listing objects:");
            objectListing = client.listObjects(new ListObjectsRequest(bucketName).
                    withMarker(nextMarker).withMaxKeys(maxKeys));
            
            List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
            for (OSSObjectSummary s : sums) {
                System.out.println("\t" + s.getKey());
            }
            
            nextMarker = objectListing.getNextMarker();
        } while (objectListing.isTruncated());

    不需要只显示文件夹,可以设置delimiter为"/"参数,对object进行分组。应该如下。
        objectListing = client.listObjects(new ListObjectsRequest(bucketName).
                withMarker(nextMarker).withMaxKeys(maxKeys).withDelimiter("/"));
    2016-01-15 11:32:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Boot2.0实战Redis分布式缓存 立即下载
CUDA MATH API 立即下载
API PLAYBOOK 立即下载