更新时间:2024-06-21 GMT+08:00
分享

列举多版本对象

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

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

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

参数

作用

bucketName

桶名。

prefix

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

keyMarker

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

maxKeys

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

delimiter

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

versionIdMarker

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

  • 如果versionIdMarker不是keyMarker的一个版本号,则该参数无效。
  • ObsClient.listVersions返回结果包含多版本对象和对象删除标记。

简单列举

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

// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
String endPoint = "https://your-endpoint";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);

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

for(VersionOrDeleteMarker v : result.getVersions()){
    Log.i("ListVersions", "\t" + v.getKey());
    Log.i("ListVersions","\t" + v.getOwner());
    Log.i("ListVersions","\t" + v.isDeleteMarker());
}
  • 每次至多返回1000个多版本对象,如果指定桶包含的对象数量大于1000,则返回结果中ListVersionsResult.isTruncated为true表明本次没有返回全部对象,并可通过ListVersionsResult.getNextKeyMarker和ListVersionsResult.getNextVersionIdMarker获取下次列举的起始位置。
  • 如果想获取指定桶包含的所有多版本对象,可以采用分页列举的方式。

指定数目列举

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

// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
String endPoint = "https://your-endpoint";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);

ListVersionsResult result = obsClient.listVersions("bucketname", 100);
for(VersionOrDeleteMarker v : result.getVersions()){
    Log.i("ListVersions","\t" + v.getKey());
    Log.i("ListVersions","\t" + v.getOwner());
    Log.i("ListVersions","\t" + v.isDeleteMarker());
}

指定前缀列举

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

// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
String endPoint = "https://your-endpoint";
// 创建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()){
    Log.i("ListVersions","\t" + v.getKey());
    Log.i("ListVersions","\t" + v.getOwner());
    Log.i("ListVersions","\t" + v.isDeleteMarker());
}

指定起始位置列举

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

// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
String endPoint = "https://your-endpoint";
// 创建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()){
    Log.i("ListVersions","\t" + v.getKey());
    Log.i("ListVersions","\t" + v.getOwner());
    Log.i("ListVersions","\t" + v.isDeleteMarker());
}

分页列举全部多版本对象

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

// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
String endPoint = "https://your-endpoint";

// 创建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()){
        Log.i("ListVersions","\t" + v.getKey());
        Log.i("ListVersions","\t" + v.getOwner());
        Log.i("ListVersions","\t" + v.isDeleteMarker());
    }
    request.setKeyMarker(result.getNextKeyMarker());
    request.setVersionIdMarker(result.getNextVersionIdMarker());
}while(result.isTruncated());

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

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

// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
String endPoint = "https://your-endpoint";
// 创建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()){
        Log.i("ListVersions","\t" + v.getKey());
        Log.i("ListVersions","\t" + v.getOwner());
        Log.i("ListVersions","\t" + v.isDeleteMarker());
    }
    request.setKeyMarker(result.getNextKeyMarker());
    request.setVersionIdMarker(result.getNextVersionIdMarker());
}while(result.isTruncated());

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

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

// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
String endPoint = "https://your-endpoint";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
ListVersionsRequest request = new ListVersionsRequest ("bucketname", 1000);
request.setDelimiter("/");
ListVersionsResult result = obsClient.listVersions(request);
Log.i("ListVersions", "Objects in the root directory:");
for(VersionOrDeleteMarker v : result.getVersions()){
    Log.i("ListVersions","\t" + v.getKey());
    Log.i("ListVersions","\t" + v.getOwner());
    Log.i("ListVersions","\t" + v.isDeleteMarker());
}

listVersionsByPrefix(obsClient, result);

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

static void listVersionsByPrefix(ObsClient obsClient, ListVersionsResult result) throws ObsException{
    for(String prefix : result.getCommonPrefixes()){
         Log.i("ListVersions", "Objects in folder [" + prefix + "]:");
         ListVersionsRequest request = new ListVersionsRequest ("bucketname", 1000);
         request.setDelimiter("/");
         request.setPrefix(prefix)
         result = obsClient.listVersions(request);
         for(VersionOrDeleteMarker v : result.getVersions()){
             Log.i("ListVersions","\t" + v.getKey());
             Log.i("ListVersions","\t" + v.getOwner());
             Log.i("ListVersions","\t" + v.isDeleteMarker());
         }
         listVersionsByPrefix(obsClient, result);
     }
}
  • 以上代码示例没有考虑文件夹中多版本对象数超过1000个的情况。
  • 由于是需要列举出文件夹中的对象和子文件夹,且文件夹对象总是以“/”结尾,因此delimiter总是为“/”。
  • 每次递归的返回结果中ListVersionsResult.getVersions包含的是文件夹中的多版本对象;ListVersionsResult.getCommonPrefixes包含的是文件夹的子文件夹。

相关文档