本文介绍如何在开启版本控制状态下列举存储空间下(Bucket)的所有文件(Object)、指定个数的文件、指定前缀的文件等。

列举Bucket中所有Object的信息

以下代码用于列举指定Bucket中包括删除标记(Delete Marker)在内的所有Object的版本信息:

// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
const accessKeyId = "<yourAccessKeyId>";
const accessKeySecret = "<yourAccessKeySecret>";
// Endpoint以杭州为例,其它Region请按实际情况填写。
const endpoint = "httpss://oss-cn-hangzhou.aliyuncs.com";
const bucket = "<yourBucketName>";

// 创建OSSClient实例。
const ossClient = new OSS({
    accessKeyId,
  accessKeySecret,
  endpoint,
  bucket
});
// 列举包括删除标记在内的所有Object的版本信息。
async function main () {
  let nextKeyMarker = null;
  let nextVersionMarker = null;
  let versionListing = null;
  do {
    versionListing = await client.getBucketVersions({
      keyMarker: nextKeyMarker,
      versionIdMarker: nextVersionMarker
    })
  
    versionListing.objects.forEach(o => {
      console.log(`${o.name}, ${o.versionId}`)
    })
    versionListing.deleteMarker.forEach(o => {
      console.log(`${o.name}, ${o.versionId}`)
    })
  
    nextKeyMarker = versionListing.NextKeyMarker;
    nextVersionMarker = versionListing.NextVersionIdMarker;
  } while (versionListing.isTruncated);
}

main()

列举指定前缀Object的版本信息

以下代码用于列举指定前缀Object的版本信息:

// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
const accessKeyId = "<yourAccessKeyId>";
const accessKeySecret = "<yourAccessKeySecret>";
// Endpoint以杭州为例,其它Region请按实际情况填写。
const endpoint = "httpss://oss-cn-hangzhou.aliyuncs.com";
const bucket = "<yourBucketName>";

// 创建OSSClient实例。
const ossClient = new OSS({
    accessKeyId,
  accessKeySecret,
  endpoint,
  bucket
});
// 指定列举以"test-"为前缀的Object的版本信息。
async function main () {
  let nextKeyMarker = null;
  let nextVersionMarker = null;
  let versionListing = null;
  const prefix = 'test-'
  do {
    versionListing = await client.getBucketVersions({
      keyMarker: nextKeyMarker,
      versionIdMarker: nextVersionMarker,
      prefix
    })
  
    versionListing.objects.forEach(o => {
      console.log(`${o.name}, ${o.versionId}`)
    })
    versionListing.deleteMarker.forEach(o => {
      console.log(`${o.name}, ${o.versionId}`)
    })
  
    nextKeyMarker = versionListing.NextKeyMarker;
    nextVersionMarker = versionListing.NextVersionIdMarker;
  } while (versionListing.isTruncated);
}

main()

列举指定个数Object的版本信息

以下代码用于列举指定个数Object的版本信息:

// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
const accessKeyId = "<yourAccessKeyId>";
const accessKeySecret = "<yourAccessKeySecret>";
// Endpoint以杭州为例,其它Region请按实际情况填写。
const endpoint = "httpss://oss-cn-hangzhou.aliyuncs.com";
const bucket = "<yourBucketName>";

// 创建OSSClient实例。
const ossClient = new OSS({
    accessKeyId,
  accessKeySecret,
  endpoint,
  bucket
});
// 指定最多列举100个Object的版本信息。
const versionListing = await client.getBucketVersions({
  'max-keys': 100
})
// 获取Object的版本信息。在未开启版本控制的情况下,VersionId为none。
versionListing.objects.forEach(o => {
  console.log(`${o.name}, ${o.versionId}`)
})
versionListing.deleteMarker.forEach(o => {
  console.log(`${o.name}, ${o.versionId}`)
})

文件夹功能

OSS没有文件夹的概念,所有元素都是以文件来存储。创建文件夹本质上来说是创建了一个大小为0并以正斜线(/)结尾的文件。这个文件可以被上传和下载,控制台会对以正斜线(/)结尾的文件以文件夹的方式展示。

通过delimiter和prefix两个参数可以模拟文件夹功能:

  • 如果设置prefix为某个文件夹名称,则会列举以此prefix开头的文件,即该文件夹下所有的文件和子文件夹(目录)均显示为Object。
  • 如果在设置了prefix的情况下,将delimiter设置为正斜线(/),则只列举该文件夹下的文件和子文件夹(目录),该文件夹下的子文件夹(目录)显示为CommonPrefixes,子文件夹下的文件和文件夹不显示。

假设存储空间中包含oss.jpgfun/test.jpgfun/movie/001.avifun/movie/007.avi4个文件,正斜线(/)作为文件夹的分隔符。以下示例说明了如何通过模拟文件夹的方式列举文件。

  • 列举根目录下的Object的版本信息

    以下代码用于列举根目录下的Object的版本信息:

    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    const accessKeyId = "<yourAccessKeyId>";
    const accessKeySecret = "<yourAccessKeySecret>";
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    const endpoint = "httpss://oss-cn-hangzhou.aliyuncs.com";
    const bucket = "<yourBucketName>";
    
    // 创建OSSClient实例。
    const ossClient = new OSS({
    	accessKeyId,
      accessKeySecret,
      endpoint,
      bucket
    });
    // 指定delimiter参数为正斜线(/),将会列举根目录下的Object的版本信息以及文件夹名称。
    async function main () {
      let nextKeyMarker = null;
      let nextVersionMarker = null;
      let versionListing = null;
      do {
        versionListing = await client.getBucketVersions({
          keyMarker: nextKeyMarker,
          versionIdMarker: nextVersionMarker,
          delimiter: '/'
        })
        nextKeyMarker = versionListing.NextKeyMarker;
        nextVersionMarker = versionListing.NextVersionIdMarker;
      } while (versionListing.isTruncated);
    }
    
    main()

    返回结果:

    {
      res: {},
      objects: [
        {
          name: 'oss.jpg',
          versionId: 'xxx',
        }
      ],
      prefixes: ["fun/"],
      NextKeyMarker: null,
      NextVersionIdMarker: null,
      isTruncated: false
    }
  • 列举目录下的文件和子目录

    以下代码用于列举指定目录下的文件和子目录:

    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    const accessKeyId = "<yourAccessKeyId>";
    const accessKeySecret = "<yourAccessKeySecret>";
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    const endpoint = "httpss://oss-cn-hangzhou.aliyuncs.com";
    const bucket = "<yourBucketName>";
    
    // 创建OSSClient实例。
    const ossClient = new OSS({
    	accessKeyId,
      accessKeySecret,
      endpoint,
      bucket
    });
    // 设置prefix参数来获取fun目录下的所有文件与文件夹,同时设置delimiter参数为正斜线(/)作为文件夹的分隔符。
    async function main () {
      let nextKeyMarker = null;
      let nextVersionMarker = null;
      let versionListing = null;
      let prefix = 'fun/'
      do {
        versionListing = await client.getBucketVersions({
          keyMarker: nextKeyMarker,
          versionIdMarker: nextVersionMarker,
          prefix,
          delimiter: '/'
        })
        nextKeyMarker = versionListing.NextKeyMarker;
        nextVersionMarker = versionListing.NextVersionIdMarker;
      } while (versionListing.isTruncated);
    }
    
    main()

    返回结果:

    {
      res: {},
      objects: [
        {
          name: 'test.jpg',
          versionId: 'xxx',
        }
      ],
      prefixes: ["fun/movie/"],
      NextKeyMarker: null,
      NextVersionIdMarker: null,
      isTruncated: false
    }