文档首页 > > SDK参考> Node.js> 多版本控制> 列举多版本对象

列举多版本对象

分享
更新时间: 2019/04/22 GMT+08:00

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

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

参数

作用

Prefix

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

KeyMarker

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

MaxKeys

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

Delimiter

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

VersionIdMarker

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

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

简单列举

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

// 引入obs 
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 使用源码安装
// var ObsClient = require('./lib/obs');
 
// 创建ObsClient实例 
var obsClient = new ObsClient({ 
    access_key_id: '*** Provide your Access Key ***',        
    secret_access_key: '*** Provide your Secret Key ***',        
    server : 'https://your-endpoint' 
}); 
 
obsClient.listVersions({ 
       Bucket : 'bucketname' 
}, (err, result) => { 
       if(err){ 
              console.log('Error-->' + err); 
       }else{ 
              console.log('Status-->' + result.CommonMsg.Status); 
              if(result.CommonMsg.Status < 300 && result.InterfaceResult){
                     // 获取多版本对象 
                     for(let j=0;j<result.InterfaceResult.Versions.length;j++){ 
                            console.log('Version[' + j +  ']:'); 
                            console.log('Key-->' + result.InterfaceResult.Versions[j]['Key']); 
                            console.log('VersionId-->' + result.InterfaceResult.Versions[j]['VersionId']); 
                            console.log('Owner[ID]-->' + result.InterfaceResult.Versions[j]['Owner']['ID']); 
                     } 
                     // 获取对象删除标记 
                     for(let i=0;i<result.InterfaceResult.DeleteMarkers.length;i++){ 
                            console.log('DeleteMarker[' + i +  ']:'); 
                            console.log('Key-->' + result.InterfaceResult.DeleteMarkers[i]['Key']); 
                            console.log('VersionId-->' + result.InterfaceResult.DeleteMarkers[i]['VersionId']); 
                            console.log('Owner[ID]-->' + result.InterfaceResult.DeleteMarkers[i]['Owner']['ID']); 
                     } 
              }
       } 
});
说明:
  • 每次至多返回1000个多版本对象,如果指定桶包含的对象数量大于1000,则返回结果中InterfaceResult.IsTruncated为true表明本次没有返回全部对象,并可通过InterfaceResult.NextKeyMarker和InterfaceResult.NextVersionIdMarker获取下次列举的起始位置。
  • 如果想获取指定桶包含的所有多版本对象,可以采用分页列举的方式。

指定数目列举

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

// 引入obs
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 使用源码安装
// var ObsClient = require('./lib/obs');

// 创建ObsClient实例
var obsClient = new ObsClient({
    access_key_id: '*** Provide your Access Key ***',       
    secret_access_key: '*** Provide your Secret Key ***',       
    server : 'https://your-endpoint'
});

obsClient.listVersions({
       Bucket : 'bucketname',
       MaxKeys : 100
}, (err, result) => {
       if(err){
              console.log('Error-->' + err);
       }else{
              console.log('Status-->' + result.CommonMsg.Status);
              if(result.CommonMsg.Status < 300 && result.InterfaceResult){
                     // 获取多版本对象 
                     for(let j=0;j<result.InterfaceResult.Versions.length;j++){ 
                            console.log('Version[' + j +  ']:'); 
                            console.log('Key-->' + result.InterfaceResult.Versions[j]['Key']); 
                            console.log('VersionId-->' + result.InterfaceResult.Versions[j]['VersionId']); 
                            console.log('Owner[ID]-->' + result.InterfaceResult.Versions[j]['Owner']['ID']); 
                     } 
                     // 获取对象删除标记 
                     for(let i=0;i<result.InterfaceResult.DeleteMarkers.length;i++){ 
                            console.log('DeleteMarker[' + i +  ']:'); 
                            console.log('Key-->' + result.InterfaceResult.DeleteMarkers[i]['Key']); 
                            console.log('VersionId-->' + result.InterfaceResult.DeleteMarkers[i]['VersionId']); 
                            console.log('Owner[ID]-->' + result.InterfaceResult.DeleteMarkers[i]['Owner']['ID']); 
                     } 
              }
       }
});

指定前缀列举

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

// 引入obs
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 使用源码安装
// var ObsClient = require('./lib/obs');

// 创建ObsClient实例
var obsClient = new ObsClient({
    access_key_id: '*** Provide your Access Key ***',       
    secret_access_key: '*** Provide your Secret Key ***',       
    server : 'https://your-endpoint'
});

// 设置列举带有prefix前缀的100个多版本对象
obsClient.listVersions({
       Bucket : 'bucketname',
       MaxKeys : 100,
       Prefix : 'prefix'
}, (err, result) => {
       if(err){
              console.log('Error-->' + err);
       }else{
              console.log('Status-->' + result.CommonMsg.Status);
              if(result.CommonMsg.Status < 300 && result.InterfaceResult){
                     // 获取多版本对象 
                     for(let j=0;j<result.InterfaceResult.Versions.length;j++){ 
                            console.log('Version[' + j +  ']:'); 
                            console.log('Key-->' + result.InterfaceResult.Versions[j]['Key']); 
                            console.log('VersionId-->' + result.InterfaceResult.Versions[j]['VersionId']); 
                            console.log('Owner[ID]-->' + result.InterfaceResult.Versions[j]['Owner']['ID']); 
                     } 
                     // 获取对象删除标记 
                     for(let i=0;i<result.InterfaceResult.DeleteMarkers.length;i++){ 
                            console.log('DeleteMarker[' + i +  ']:'); 
                            console.log('Key-->' + result.InterfaceResult.DeleteMarkers[i]['Key']); 
                            console.log('VersionId-->' + result.InterfaceResult.DeleteMarkers[i]['VersionId']); 
                            console.log('Owner[ID]-->' + result.InterfaceResult.DeleteMarkers[i]['Owner']['ID']);  
                     } 
              }
       }
});

指定起始位置列举

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

// 引入obs
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 使用源码安装
// var ObsClient = require('./lib/obs');

// 创建ObsClient实例
var obsClient = new ObsClient({
    access_key_id: '*** Provide your Access Key ***',       
    secret_access_key: '*** Provide your Secret Key ***',       
    server : 'https://your-endpoint'
});

// 设置列举对象名字典序在"test"之后的100个多版本对象
obsClient.listVersions({
       Bucket : 'bucketname',
       MaxKeys : 100,
       KeyMarker : 'test'
}, (err, result) => {
       if(err){
              console.log('Error-->' + err);
       }else{
              console.log('Status-->' + result.CommonMsg.Status);
              if(result.CommonMsg.Status < 300 && result.InterfaceResult){
                     // 获取多版本对象 
                     for(let j=0;j<result.InterfaceResult.Versions.length;j++){ 
                            console.log('Version[' + j +  ']:'); 
                            console.log('Key-->' + result.InterfaceResult.Versions[j]['Key']); 
                            console.log('VersionId-->' + result.InterfaceResult.Versions[j]['VersionId']); 
                            console.log('Owner[ID]-->' + result.InterfaceResult.Versions[j]['Owner']['ID']); 
                     } 
                     // 获取对象删除标记 
                     for(let i=0;i<result.InterfaceResult.DeleteMarkers.length;i++){ 
                            console.log('DeleteMarker[' + i +  ']:'); 
                            console.log('Key-->' + result.InterfaceResult.DeleteMarkers[i]['Key']); 
                            console.log('VersionId-->' + result.InterfaceResult.DeleteMarkers[i]['VersionId']); 
                            console.log('Owner[ID]-->' + result.InterfaceResult.DeleteMarkers[i]['Owner']['ID']); 
                     } 
              }
       }
});

分页列举全部多版本对象

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

// 引入obs 
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 使用源码安装
// var ObsClient = require('./lib/obs');
 
// 创建ObsClient实例 
var obsClient = new ObsClient({ 
    access_key_id: '*** Provide your Access Key ***',        
    secret_access_key: '*** Provide your Secret Key ***',        
    server : 'https://your-endpoint' 
}); 
 
var listAll = (keyMarker, versionIdMarker) => { 
       obsClient.listVersions({ 
              Bucket : 'bucketname', 
              MaxKeys : 100, 
              KeyMarker : keyMarker, 
              VersionIdMarker : versionIdMarker 
       }, (err, result) => { 
              if(err){ 
                     console.log('Error-->' + err); 
              }else{ 
                     console.log('Status-->' + result.CommonMsg.Status); 
                     if(result.CommonMsg.Status < 300 && result.InterfaceResult){
                            // 获取多版本对象 
                            for(let j=0;j<result.InterfaceResult.Versions.length;j++){ 
                                  console.log('Version[' + j +  ']:'); 
                                  console.log('Key-->' + result.InterfaceResult.Versions[j]['Key']); 
                                  console.log('VersionId-->' + result.InterfaceResult.Versions[j]['VersionId']); 
                                  console.log('Owner[ID]-->' + result.InterfaceResult.Versions[j]['Owner']['ID']); 
                            } 
                            // 获取对象删除标记 
                            for(let i=0;i<result.InterfaceResult.DeleteMarkers.length;i++){ 
                                  console.log('DeleteMarker[' + i +  ']:'); 
                                  console.log('Key-->' + result.InterfaceResult.DeleteMarkers[i]['Key']); 
                                  console.log('VersionId-->' + result.InterfaceResult.DeleteMarkers[i]['VersionId']); 
                                  console.log('Owner[ID]-->' + result.InterfaceResult.DeleteMarkers[i]['Owner']['ID']); 
                            } 
                            if(result.InterfaceResult.IsTruncated === 'true'){ 
                                  listAll(result.InterfaceResult.NextKeyMarker, result.InterfaceResult.NextVersionIdMarker); 
                            }
                     }
              } 
       }); 
}; 
 
listAll();

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

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

// 引入obs
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 使用源码安装
// var ObsClient = require('./lib/obs');

// 创建ObsClient实例
var obsClient = new ObsClient({
    access_key_id: '*** Provide your Access Key ***',       
    secret_access_key: '*** Provide your Secret Key ***',       
    server : 'https://your-endpoint'
});

var listAll = (keyMarker, versionIdMarker) => {
       obsClient.listVersions({
              Bucket : 'bucketname',
              MaxKeys : 100,
              KeyMarker : keyMarker,
              VersionIdMarker : versionIdMarker,
              // 设置文件夹对象名"dir/"为前缀
              Prefix : 'dir/'
       }, (err, result) => {
              if(err){
                     console.log('Error-->' + err);
              }else{
                     console.log('Status-->' + result.CommonMsg.Status);
                     if(result.CommonMsg.Status < 300 && result.InterfaceResult){
                            // 获取多版本对象 
                            for(let j=0;j<result.InterfaceResult.Versions.length;j++){ 
                                  console.log('Version[' + j +  ']:'); 
                                  console.log('Key-->' + result.InterfaceResult.Versions[j]['Key']); 
                                  console.log('VersionId-->' + result.InterfaceResult.Versions[j]['VersionId']); 
                                  console.log('Owner[ID]-->' + result.InterfaceResult.Versions[j]['Owner']['ID']); 
                             } 
                            // 获取对象删除标记 
                            for(let i=0;i<result.InterfaceResult.DeleteMarkers.length;i++){ 
                                  console.log('DeleteMarker[' + i +  ']:'); 
                                  console.log('Key-->' + result.InterfaceResult.DeleteMarkers[i]['Key']); 
                                  console.log('VersionId-->' + result.InterfaceResult.DeleteMarkers[i]['VersionId']); 
                                  console.log('Owner[ID]-->' + result.InterfaceResult.DeleteMarkers[i]['Owner']['ID']); 
                             } 
                            if(result.InterfaceResult.IsTruncated === 'true'){ 
                                  listAll(result.InterfaceResult.NextKeyMarker, result.InterfaceResult.NextVersionIdMarker); 
                            }
                     }
              }
       });
};

listAll();

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

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

// 引入obs 
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 使用源码安装
// var ObsClient = require('./lib/obs');
 
// 创建ObsClient实例 
var obsClient = new ObsClient({ 
    access_key_id: '*** Provide your Access Key ***',        
    secret_access_key: '*** Provide your Secret Key ***',        
    server : 'https://your-endpoint' 
}); 
 
obsClient.listVersions({ 
       Bucket : 'bucketname', 
       // 设置文件夹分隔符"/" 
       Delimiter : '/' 
}, (err, result) => { 
       if(err){ 
              console.log('Error-->' + err); 
       }else{ 
              console.log('Objects in the root directory:'); 
              if(result.CommonMsg.Status < 300 && result.InterfaceResult){
                  // 获取多版本对象. 
                  for(let j=0;j<result.InterfaceResult.Versions.length;j++){ 
                         console.log('Version[' + j +  ']:'); 
                         console.log('Key-->' + result.InterfaceResult.Versions[j]['Key']); 
                         console.log('VersionId-->' + result.InterfaceResult.Versions[j]['VersionId']); 
                         console.log('Owner[ID]-->' + result.InterfaceResult.Versions[j]['Owner']['ID']); 
                  } 
                  // 获取对象删除标记.
                  for(let i=0;i<result.InterfaceResult.DeleteMarkers.length;i++){ 
                         console.log('DeleteMarker[' + i +  ']:'); 
                         console.log('Key-->' + result.InterfaceResult.DeleteMarkers[i]['Key']); 
                         console.log('VersionId-->'+ result.InterfaceResult.DeleteMarkers[i]['VersionId']); 
                         console.log('Owner[ID]-->' + result.InterfaceResult.DeleteMarkers[i]['Owner']['ID']); 
                  } 
              }    
              var listVersionsByPrefix = (commonPrefixes) => { 
                     for(let n=0;n<commonPrefixes.length;n++){ 
                           obsClient.listVersions({ 
                                  Bucket : 'bucketname', 
                                  Delimiter : '/', 
                                  Prefix: commonPrefixes[n]['Prefix'] 
                           }, (err, result) => { 
                                  console.log('Objects in folder [' + commonPrefixes[n]['Prefix'] + ']:'); 
                                  if(result.CommonMsg.Status < 300 && result.InterfaceResult){
                                    // 获取多版本对象 
                                    for(let j=0;j<result.InterfaceResult.Versions.length;j++){ 
                                           console.log('Version[' + j +  ']:'); 
                                           console.log('Key-->' + result.InterfaceResult.Versions[j]['Key']); 
                                           console.log('VersionId-->' + result.InterfaceResult.Versions[j]['VersionId']); 
                                           console.log('Owner[ID]-->' + result.InterfaceResult.Versions[j]['Owner']['ID']); 
                                    } 
                                    // 获取对象删除标记 
                                    for(let i=0;i<result.InterfaceResult.DeleteMarkers.length;i++){ 
                                           console.log('DeleteMarker[' + i +  ']:'); 
                                           console.log('Key-->' + result.InterfaceResult.DeleteMarkers[i]['Key']); 
                                           console.log('VersionId-->' + result.InterfaceResult.DeleteMarkers[i]['VersionId']); 
                                           console.log('Owner[ID]-->' + result.InterfaceResult.DeleteMarkers[i]['Owner']['ID']); 
                                    } 
                                    console.log('\n'); 
                                    if(result.InterfaceResult.CommonPrefixes && result.InterfaceResult.CommonPrefixes.length > 0){ 
                                           listVersionsByPrefix(result.InterfaceResult.CommonPrefixes); 
                                    } 
                                  }
                           }); 
                     } 
              }; 
              listVersionsByPrefix(result.InterfaceResult.CommonPrefixes); 
       } 
});
说明:
  • 以上代码示例没有考虑文件夹中多版本对象数超过1000个的情况。
  • 由于是需要列举出文件夹中的对象和子文件夹,且文件夹对象总是以“/”结尾,因此Delimiter总是为“/”。
  • 每次递归的返回结果中InterfaceResult.Versions包含的是文件夹中的对象;InterfaceResult.DeleteMarkers包含的是文件夹中的删除标记;InterfaceResult.CommonPrefixes包含的是文件夹的子文件夹。
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区