• 沒有找到結果。

须知

开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论 坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。

您可以通过ObsClient.listVersions列举多版本对象。

该接口可设置的参数如下:

参数 作用

bucketName 桶名。

Java SDK 开发指南 13 多版本控制

参数 作用

prefix 限定返回的对象名必须带有prefix前缀。

keyMarker 列举多版本对象的起始位置,返回的对象列表将是对象名按照 字典序排序后该参数以后的所有对象。

maxKeys 列举多版本对象的最大数目,取值范围为1~1000,当超出范围 时,按照默认的1000进行处理。

delimiter 用于对对象名进行分组的字符。对于对象名中包含delimiter的 对象,其对象名(如果请求中指定了prefix,则此处的对象名需 要去掉prefix)中从首字符至第一个delimiter之间的字符串将作 为一个分组并作为commonPrefix返回。

versionIdMarker 与keyMarker配合使用,返回的对象列表将是对象名和版本号按 照字典序排序后该参数以后的所有对象。

说明

● 如果versionIdMarker不是keyMarker的一个版本号,则该参数无效。

● ObsClient.listVersions返回结果包含多版本对象和对象删除标记。

简单列举

以下代码展示如何简单列举多版本对象,最多返回1000个对象:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

ListVersionsResult result = obsClient.listVersions("bucketname");

for(VersionOrDeleteMarker v : result.getVersions()){

System.out.println("\t" + v.getKey());

System.out.println("\t" + v.getOwner());

System.out.println("\t" + v.isDeleteMarker());

}

说明

● 每次至多返回1000个多版本对象,如果指定桶包含的对象数量大于1000,则返回结果中 ListVersionsResult.isTruncated为true表明本次没有返回全部对象,并可通过

ListVersionsResult.getNextKeyMarker和ListVersionsResult.getNextVersionIdMarker获取下 次列举的起始位置。

● 如果想获取指定桶包含的所有多版本对象,可以采用分页列举的方式。

指定数目列举

以下代码展示如何指定数目列举多版本对象:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

Java SDK 开发指南 13 多版本控制

ListVersionsResult result = obsClient.listVersions("bucketname", 100);

for(VersionOrDeleteMarker v : result.getVersions()){

System.out.println("\t" + v.getKey());

System.out.println("\t" + v.getOwner());

System.out.println("\t" + v.isDeleteMarker());

}

指定前缀列举

以下代码展示如何指定前缀列举多版本对象:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// 列举带有prefix前缀的100个多版本对象

ListVersionsRequest request = new ListVersionsRequest ("bucketname", 100);

request.setPrefix("prefix");

ListVersionsResult result = obsClient.listVersions(request);

for(VersionOrDeleteMarker v : result.getVersions()){

System.out.println("\t" + v.getKey());

System.out.println("\t" + v.getOwner());

System.out.println("\t" + v.isDeleteMarker());

}

指定起始位置列举

以下代码展示如何指定起始位置列举多版本对象:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// 列举对象名字典序在"test"之后的100个多版本对象

ListVersionsRequest request = new ListVersionsRequest ("bucketname", 100);

request.setKeyMarker("test");

ListVersionsResult result = obsClient.listVersions(request);

for(VersionOrDeleteMarker v : result.getVersions()){

System.out.println("\t" + v.getKey());

System.out.println("\t" + v.getOwner());

System.out.println("\t" + v.isDeleteMarker());

}

分页列举全部多版本对象

以下代码展示分页列举全部多版本对象:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

ListVersionsResult result;

ListVersionsRequest request = new ListVersionsRequest ("bucketname", 100);

do{ result = obsClient.listVersions(request);

for(VersionOrDeleteMarker v : result.getVersions()){

System.out.println("\t" + v.getKey());

System.out.println("\t" + v.getOwner());

Java SDK 开发指南 13 多版本控制

System.out.println("\t" + v.isDeleteMarker());

}

request.setKeyMarker(result.getNextKeyMarker());

request.setVersionIdMarker(result.getNextVersionIdMarker());

}while(result.isTruncated());

列举文件夹中的所有多版本对象

OBS本身是没有文件夹的概念的,桶中存储的元素只有对象。文件夹对象实际上是一 个大小为0且对象名以“/”结尾的对象,将这个文件夹对象名作为前缀,即可模拟列 举文件夹中对象的功能。以下代码展示如何列举文件夹中的多版本对象:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

ListVersionsResult result;

ListVersionsRequest request = new ListVersionsRequest ("bucketname", 100);

// 设置文件夹对象名"dir/"为前缀 request.setPrefix("dir/");

do{ result = obsClient.listVersions(request);

for(VersionOrDeleteMarker v : result.getVersions()){

System.out.println("\t" + v.getKey());

System.out.println("\t" + v.getOwner());

System.out.println("\t" + v.isDeleteMarker());

}

request.setKeyMarker(result.getNextKeyMarker());

request.setVersionIdMarker(result.getNextVersionIdMarker());

}while(result.isTruncated());

按文件夹分组列举所有多版本对象

以下代码展示如何按文件夹分组,列举桶内所有多版本对象:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

ListVersionsRequest request = new ListVersionsRequest ("bucketname", 1000);

request.setDelimiter("/");

ListVersionsResult result = obsClient.listVersions(request);

System.out.println("Objects in the root directory:");

for(VersionOrDeleteMarker v : result.getVersions()){

System.out.println("\t" + v.getKey());

System.out.println("\t" + v.getOwner());

System.out.println("\t" + v.isDeleteMarker());

}

listVersionsByPrefix(obsClient, result);

递归列出子文件夹中多版本对象的函数listVersionsByPrefix的示例代码如下:

static void listVersionsByPrefix(ObsClient obsClient, ListVersionsResult result) throws ObsException{

for(String prefix : result.getCommonPrefixes()){

System.out.println("Objects in folder [" + prefix + "]:");

ListVersionsRequest request = new ListVersionsRequest ("bucketname", 1000);

request.setDelimiter("/");

request.setPrefix(prefix)

result = obsClient.listVersions(request);

for(VersionOrDeleteMarker v : result.getVersions()){

System.out.println("\t" + v.getKey());

System.out.println("\t" + v.getOwner());

Java SDK 开发指南 13 多版本控制

System.out.println("\t" + v.isDeleteMarker());

}

listVersionsByPrefix(obsClient, result);

} }

说明

● 以上代码示例没有考虑文件夹中多版本对象数超过1000个的情况。

● 由于是需要列举出文件夹中的对象和子文件夹,且文件夹对象总是以“/”结尾,因此 delimiter总是为“/”。

● 每次递归的返回结果中ListVersionsResult.getVersions包含的是文件夹中的多版本对象;

ListVersionsResult.getCommonPrefixes包含的是文件夹的子文件夹。