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

删除单个文件

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

以下提供了永久删除指定版本Object及临时删除Object的示例。
  • 指定versionId永久删除Object
    以下代码用于永久删除指定版本的Object:
    # -*- coding: utf-8 -*-
    import os
    import oss2
    
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint以杭州为例,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
    object_name = '<yourObjectName>'
    
    # 指定object的版本id,也可以是删除标记的版本id。
    params = dict()
    params['versionId'] = '<yourObjectVersionIdOrDeleteMarkerVersionId>'
    
    # 删除指定版本id的object或删除指定删除标记版本id的object。
    result = bucket.delete_object(object_name, params=params)
    print("delete object name: ", object_name)
    # 如果指定的是object的版本id,则返回的delete_marker为None且返回的versionid为前面指定的object版本id。
    # 如果指定的是删除标记的版本id,则返回的delete_marker为True且返回的versionid为前面指定的删除标记的版本id。
    if result.delete_marker:
        print("delete del-marker versionid: ",result.versionid)
    else:
        print("delete object versionid:", result.versionid)
  • 不指定versionId临时删除Object
    以下代码用于临时删除Object:
    # -*- coding: utf-8 -*-
    import os
    import oss2
    
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint以杭州为例,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
    object_name = '<yourObjectName>'
    
    # 不指定版本id删除object。
    result = bucket.delete_object(object_name)
    # 查看删除标记。
    print("delete marker: ", result.delete_marker)
    # 查看返回删除标记的版本id。
    print("delete marker versionid: ", result.versionid)

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

删除多个文件

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

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

  • 不指定versionID删除多个Object
    以下代码用于不指定versionId删除多个Object:
    # -*- coding: utf-8 -*-
    import os
    import oss2
    from oss2.models import BatchDeleteObjectVersion
    from oss2.models import BatchDeleteObjectVersionList
    
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint以杭州为例,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
    
    
    key_list = ['<yourObject1Name>', '<yourObject2Name>']
    # 不指定版本的删除操作后,object将会加入删除标记(delete_marker)
    result = bucket.batch_delete_objects(key_list)
    for del_version in result.delete_versions:
        print('key name:', del_version.key)
        # 打印返回的删除标记。
        print('Is del marker:', del_version.delete_marker)
        print('key del_marker.versionid', del_version.delete_marker_versionid)
  • 指定versionId删除多个Object
    以下代码用于删除多个指定versionId的Object或指定删除标记versionId的Object:
    # -*- coding: utf-8 -*-
    import os
    import oss2
    from oss2.models import BatchDeleteObjectVersion
    from oss2.models import BatchDeleteObjectVersionList
    
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint以杭州为例,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
    
    version_list = BatchDeleteObjectVersionList()
    # 可以传入object的版本id或者删除标记版本id。
    obj1_versionid = '<yourObject1VersionId>'
    obj1_del_marker_versionid = '<yourObject1DelMarkerVersionId>'
    obj2_versionid = '<yourObject2VersionId>'
    obj2_del_marker_versionid = '<yourObject2DelMarkerVersionId>'
    version_list.append(BatchDeleteObjectVersion(key='<yourObject1Name>', versionid=obj1_versionid))
    version_list.append(BatchDeleteObjectVersion(key='<yourObject1Name>', versionid=obj1_del_marker_versionid))
    version_list.append(BatchDeleteObjectVersion(key='<yourObject2Name>', versionid=obj2_versionid))
    version_list.append(BatchDeleteObjectVersion(key='<yourObject2Name>', versionid=obj2_del_marker_versionid))
    
    # 批量删除指定版本id的object或批量删除指定删除标记版本id的object。
    result = bucket.delete_object_versions(version_list)
    # 查看删除的object版本或删除的删除标记版本。
    for del_version in result.delete_versions:
        print('del object name:', del_version.key)
        # 查看删除的是否是删除标记。
        print('Is del marker:', del_version.delete_marker)
        # 如果是删除标记,则打印删除的删除标记版本id,否则打印删除的object版本id。
        if del_version.delete_marker :
            print('del object del_marker.versionid', del_version.delete_marker_versionid)
        else:
            print('del object versionid:', del_version.versionid)

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

删除指定前缀(prefix)的文件

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

# -*- coding: utf-8 -*-
import oss2

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

# 列举所有指定前缀文件的版本信息并删除。
next_key_marker = None
next_versionid_marker = None
while True:
    result = bucket.list_object_versions(prefix=prefix, key_marker=next_key_marker, versionid_marker=next_versionid_marker)

    for version_info in result.versions:
        bucket.delete_object(version_info.key, params={'versionId': version_info.versionid})

    for del_marker_info in result.delete_marker:
        bucket.delete_object(del_marker_info.key, params={'versionId': del_marker_info.versionid})

    is_truncated = result.is_truncated

    if is_truncated:
        next_key_marker = result.next_key_marker
        next_versionid_marker = result.next_versionid_marker
    else:
        break