本文介绍如何在受版本控制的存储空间(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({ // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。 region: 'yourregion', // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 accessKeyId: 'yourAccessKeyId', accessKeySecret: 'yourAccessKeySecret', // yourbucketname填写存储空间名称。 bucket: 'yourbucketname' }); // 删除指定versionId的Object。 const versionId = 'yourversionId'; async function deleteVersionObject() { const result = await client.delete(obj.name, { versionId }); } deleteVersionObject();
- 临时删除
以下代码用于不指定versionId对Object进行临时删除:
const OSS = require('ali-oss'); const client = new OSS({ // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。 region: 'yourregion', // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 accessKeyId: 'yourAccessKeyId', accessKeySecret: 'yourAccessKeySecret', // yourbucketname填写存储空间名称。 bucket: 'yourbucketname' }); // 不指定versionId对Object进行临时删除,此操作会为Object添加删除标记。 async function deleteObject() { const result = await client.delete(obj.name); } deleteObject();
删除多个文件
以下提供了永久删除以及临时删除多个Object的示例。
- 永久删除
以下代码用于指定versionId对多个Object及删除标记进行永久删除:
const OSS = require('ali-oss'); const client = new OSS({ // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。 region: 'yourregion', // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 accessKeyId: 'yourAccessKeyId', accessKeySecret: 'yourAccessKeySecret', // yourbucketname填写存储空间名称。 bucket: 'yourbucketname' }); // 删除多个指定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();
- 临时删除
以下代码用于不指定versionId对多个Object进行临时删除。
const OSS = require('ali-oss'); const client = new OSS({ // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。 region: 'yourregion', // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 accessKeyId: 'yourAccessKeyId', accessKeySecret: 'yourAccessKeySecret', // yourbucketname填写存储空间名称。 bucket: 'yourbucketname' }); 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({
// yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'yourregion',
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
accessKeyId: 'yourAccessKeyId',
accessKeySecret: 'yourAccessKeySecret',
// yourbucketname填写存储空间名称。
bucket: 'yourbucketname'
});
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
});
}
}
相关文档
- 关于删除单个文件的API接口说明,请参见DeleteObject。
- 关于删除多个文件的API接口说明,请参见DeleteMultipleObjects。