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

删除单个文件

对于开启版本控制的Bucket执行DeleteObject操作时,如果未指定versionId,则保留Object的当前版本,并插入删除标记(Delete Marker)。如果指定versionId,则永久删除该指定版本ID的Object。

说明
  • 未指定versionId:

    如果在未指定versionId的情况下执行DeleteObject操作时,默认仅作用于Object的当前版本,但不会直接删除该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的情况下调用DeleteObject接口时,OSS会根据params参数中指定的versionId参数永久删除该版本。如果要删除ID为“null”的版本,则调用DeleteObject接口时,在params参数中添加 params['versionId'] =“null”,OSS将“null”字符串当成“null”版本的ID号,从而删除版本ID为“null”的Object。

以下提供了永久删除指定版本Object及临时删除Object的示例。

  • 指定versionId永久删除Object

    以下代码用于永久删除指定版本的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

    以下代码用于临时删除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>'
    });
    
    // 在受版本控制状态下的bucket,不指定版本id删除object时,将会给object添加删除标记。
    async function deleteObject() {
      const result = await client.delete(obj.name);
    }
    deleteObject();

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

删除多个文件

在开启版本控制的Bucket中,您可以使用DeleteObjects接口来批量删除Object。在Delete请求中如果没有指定versionId,将插入删除标记。如果指定了versionId,将永久删除该Object的指定版本。

  • 不指定versionID删除多个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>'
    });
    
    const names = ['key1.js', 'key2.js'];
    
    async function deleteMulti() {
      //不指定versionId删除多个object。
      const result = await client.deleteMulti(names);
      console.log(result);
    }
    deleteMulti();
  • 指定versionId删除多个Object

    以下代码用于删除多个指定versionId的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

删除指定前缀的文件

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

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的versionId进行删除。
    const versionId = obj.versionId; 
    await client.delete(obj.name, {
      versionId
    });
  }
}