本文介绍如何在受版本控制的存储空间(Bucket)中删除单个或多个文件(Object))以及指定前缀的(Prefix)的文件。

版本控制下的删除行为

版本控制下的删除行为说明如下:

  • 未指定versionId(临时删除):

    如果在未指定versionId的情况下执行删除操作时,默认不会删除Object的当前版本,而是对当前版本插入删除标记(Delete Marker)。当执行GetObject操作时,OSS会检测到当前版本为删除标记,并返回404 Not Found。此外,响应中会返回header:x-oss-delete-marker = true以及新生成的删除标记的版本号x-oss-version-id

    x-oss-delete-marker的值为true,表示与返回的x-oss-version-id对应的版本为删除标记。

  • 指定versionId(永久删除):

    如果在指定versionId的情况下执行删除操作时,OSS会根据params中指定的versionId参数永久删除该版本。如果要删除ID为“null”的版本,请在params参数中添加params['versionId'] = “null”,OSS将“null”字符串当成“null”的versionId,从而删除versionId为“null”的Object。

删除单个文件

以下提供了永久删除及临时删除单个Object的示例。

  • 永久删除

    以下代码用于指定versionId对Object进行永久删除:

    const OSS = require('ali-oss');
    
    const client = new OSS({
      bucket: '<Your BucketName>',
      // region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
      region: '<Your Region>',
      // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
      accessKeyId: '<Your AccessKeyId>',
      accessKeySecret: '<Your AccessKeySecret>'
    });
    
    // 删除指定versionId的Object。
    const versionId = 'your versionId';
    
    async function deleteVersionObject() {
      const result = await client.delete(obj.name, {
        versionId
      });
    }
    deleteVersionObject();
  • 临时删除

    以下代码用于不指定versionId对Object进行临时删除:

    const OSS = require('ali-oss');
    
    const client = new OSS({
      bucket: '<Your BucketName>',
      // region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
      region: '<Your Region>',
      // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
      accessKeyId: '<Your AccessKeyId>',
      accessKeySecret: '<Your AccessKeySecret>'
    });
    
    // 不指定versionId对Object进行临时删除,此操作会为Object添加删除标记。
    async function deleteObject() {
      const result = await client.delete(obj.name);
    }
    deleteObject();

    删除单个文件的详细信息请参见DeleteObject

删除多个文件

以下提供了永久删除以及临时删除多个Object的示例。

  • 永久删除

    以下代码用于指定versionId对多个Object及删除标记进行永久删除:

    const OSS = require('ali-oss');
    
    const client = new OSS({
      bucket: '<Your BucketName>',
      // region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
      region: '<Your Region>',
      // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
      accessKeyId: '<Your AccessKeyId>',
      accessKeySecret: '<Your AccessKeySecret>'
    });
    
    // 删除多个指定versionId的Object,或删除指定versionId的删除标记关联的Object。
    const names = [
      { key: 'key1.js', versionId: 'versionId1' },
      { key: 'key2.js', versionId: 'versionId2' }
    ];
    
    async function deleteMulti() {
      const result = await client.deleteMulti(names);
      console.log(result);
    }
    deleteMulti();

    删除多个文件的详细信息请参见DeleteMultipleObjects

  • 临时删除

    以下代码用于不指定versionId对多个Object进行临时删除:

    const OSS = require('ali-oss');
    
    const client = new OSS({
      bucket: '<Your BucketName>',
      // region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
      region: '<Your Region>',
      // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
      accessKeyId: '<Your AccessKeyId>',
      accessKeySecret: '<Your AccessKeySecret>'
    });
    
    const names = ['key1.js', 'key2.js'];
    
    async function deleteMulti() {
      // 不指定versionId删除多个Object。
      const result = await client.deleteMulti(names);
      console.log(result);
    }
    deleteMulti();

删除指定前缀的文件

以下代码用于删除指定前缀的文件:

const OSS = require('ali-oss');

const client = new OSS({
  bucket: '<Your BucketName>',
  // region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
  region: '<Your Region>',
  // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>'
});

async function deleteMutiPrefix(prefix) {
  // 获取指定前缀的Object的versionId信息。
  const list = client.getBucketVersions({
    prefix: prefix,
  });

  list.objects = list.objects || [];
  for (let i = 0; i < result.objects.length; i++) {
    const obj = result.objects[i]; 
    // 删除指定前缀的Object。
    const versionId = obj.versionId; 
    await client.delete(obj.name, {
      versionId
    });
  }
}