获取目录文件列表

SDK 提供ListObjects方法用于获取目录文件列表,完整代码详见Github

ListObjects方法请求的 US3 API 为 ListObjects,具体详见ListObjects API文档

参数说明

参数名 类型 说明
Prefix string 返回以Prefix作为前缀的目录文件列表, 为""时默认全匹配
Marker string 返回以字母排序后,大于Marker的目录文件列表
MaxKeys int 指定返回目录文件列表的最大数量,默认值为100,不超过1000
Delimiter string 目录分隔符,当前只支持"/"和"",当Delimiter设置为"/"时,非递归列举,Prefix需以"/"结尾;当Delimiter设置为""时,递归列举所有文件

非递归获取指定前缀的所有文件

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
public class ObjectListWithDirFormatSample {
    private static final String TAG = "ObjectListWithDirFormatSample";
    private static ObjectConfig config = new ObjectConfig("cn-sh2", "ufileos.com");

    public static void main(String[] args) {
        String bucketName = "";

        execute_list_all(bucketName);
    }

    //拉取一页列表
    public static void execute(String bucketName) {
        try {
            ObjectListWithDirFormatBean response = UfileClient.object(Constants.OBJECT_AUTHORIZER, config)
                    .objectListWithDirFormat(bucketName)
                    /**
                     * 过滤前缀
                     */
//                .withPrefix("")
                    /**
                     * 分页标记
                     */
//                .withMarker("")   //如果要拉下一页,withMarker 里要把 response.getNextMarker()  填进去,就可以拉下一页;
                    //如果 response.getNextMarker() 为"" 表示列表已经拉完了
                    //参考:https://github.com/ufilesdk-dev/elasticsearch-repository-ufile/blob/dev/src/main/java/org/elasticsearch/repository/ufile/UfileBlobStore.java,函数 listBlobsByPrefix
                    /**
                     * 分页数据上限,Default = 20
                     */
//                .dataLimit(10)
                    /**
                     * 目录分隔符,Default = '/',当前只支持是'/'
                     */
                    .withDelimiter("/")
                    .execute();
            JLog.D(TAG, String.format("[res] = %s", (response == null ? "null" : response.toString())));
        } catch (UfileClientException e) {
            e.printStackTrace();
        } catch (UfileServerException e) {
            e.printStackTrace();
        }
    }

    //拉取全部文件列表
    /*关于分页拉列表:
    第一次拉: nextMarker 填 "",  返回值里,会有 nextMarker 的值  "xxxx", 返回 0-99 的结果
    第二次拉: nextMarker 填 "xxxx",  就可以拉  100-199  的结果,通过会返回新的 nextMarker "yyyy"
    第三次拉: nextMarker 填 "yyyy",  就可以拉  200-299  的结果,通过会返回新的 nextMarker "zzzz"
            。。。。
    直到, 如果拉到列表尾部了, nextMarker 会返回长度为0的串,  表示到达尾部; 就拉完了, 不需要继续拉列表
    https://docs.ucloud.cn/api/ufile-api/prefix_file_list
    */
    public static void execute_list_all(String bucketName) {
        try {
            String nextMarker = "";
            List<CommonPrefix> directories = new ArrayList<>();
            String prefix = "";
            do {
                ObjectListWithDirFormatBean response = UfileClient.object(Constants.OBJECT_AUTHORIZER, config)
                        .objectListWithDirFormat(bucketName)
                        .withMarker(nextMarker)
                        .dataLimit(100)
                        .withPrefix(prefix)
                        /**
                         * 目录分隔符,Default = '/',当前只支持是'/'
                         */
                        .withDelimiter("/")
                        .execute();
                //遍历结果
                if (response == null || response.getObjectContents() == null)
                    break;

                for (ObjectContentBean content : response.getObjectContents()) {
                    if (content == null)
                        continue;
                    JLog.D(TAG, String.format("keyname: %s", content.toString()));
                }
                if (response.getCommonPrefixes() != null) {
                    for (CommonPrefix commonPrefix : response.getCommonPrefixes()) {
                        JLog.D(TAG, String.format("directory: %s", commonPrefix.getPrefix()));
                    }
                }
                //获取下一页
                nextMarker = response.getNextMarker();
                if (response.getCommonPrefixes() != null)
                    directories.addAll(response.getCommonPrefixes());
                if (directories.isEmpty())
                    prefix = null;
                if ((nextMarker == null || nextMarker.isEmpty()) && !directories.isEmpty()) {
                    nextMarker = "";
                    prefix = directories.remove(0).getPrefix();
                }
            } while ((nextMarker != null && nextMarker.length() > 0) || (prefix != null && prefix.length() > 0));

        } catch (UfileClientException e) {
            e.printStackTrace();
        } catch (UfileServerException e) {
            e.printStackTrace();
        }
    }

    public static void executeAsync(String bucketName) {
        UfileClient.object(Constants.OBJECT_AUTHORIZER, config)
                .objectListWithDirFormat(bucketName)
                /**
                 * 过滤前缀
                 */
//                .withPrefix("")
                /**
                 * 分页标记
                 */
//                .withMarker("")
                /**
                 * 分页数据上限,Default = 20
                 */
//                .dataLimit(10)
                /**
                 * 目录分隔符,Default = '/',当前只支持是'/'
                 */
                .withDelimiter("/")
                .executeAsync(new UfileCallback<ObjectListWithDirFormatBean>() {

                    @Override
                    public void onResponse(ObjectListWithDirFormatBean response) {
                        JLog.D(TAG, String.format("[res] = %s", (response == null ? "null" : response.toString())));
                    }

                    @Override
                    public void onError(Request request, ApiError error, UfileErrorBean response) {
                        JLog.D(TAG, String.format("[error] = %s\n[info] = %s",
                                (error == null ? "null" : error.toString()),
                                (response == null ? "null" : response.toString())));
                    }
                });
    }
}

错误码

HTTP 状态码 RetCode ErrMsg 描述
400 -148653 bucket not exists 存储空间不存在
400 -15036 check md5 failed MD5校验失败
401 -148643 no authorization found 上传凭证错误
403 -148643 invalid signature API公私钥错误
404 -148654 file not exist 文件不存在
400 -15005 invalid delimiter:xxx delimiter 取值为 "" 或 "/"
400 -15005 invalid maxkeys:xxx maxkeys 取值范围 [0, 1000]