本文介绍如何在受版本控制的存储空间(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的情况下调用delete_object接口时,OSS会根据params参数中指定的versionId参数永久删除该版本。如果要删除ID为“null”的版本,则调用delete_object接口时,在params参数中添加 params['versionId'] = “null”,OSS将“null”字符串当成“null”版本的ID号,从而删除版本ID为“null”的Object。

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

  • 永久删除指定版本Object
    以下代码用于指定Object的versionId永久删除指定版本的Object:
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    String bucketName = "<yourBucketName>";
    String objectName = "<yourObjectName>";
    // 可以传入文件版本id,也可以传入删除标记的版本id。
    String versionid = "<yourObjectVersionidOrDelMarkerVersionid>";
    
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // 删除指定版本的object。
    ossClient.deleteVersion(bucketName, objectName , versionid);
    
    // 关闭OSSClient。
    ossClient.shutdown();
  • 临时删除Object
    以下代码用于不指定Object的versionId临时删除Object:
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    String bucketName = "<yourBucketName>";
    String objectName = "<yourObjectName>";
    
    // 创建OSSClient实例。
    OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    
    // 开启版本控制状态下,此方法为临时删除,将会给object添加删除标记。
    ossClient.deleteObject(bucketName, objectName);
    
    // 关闭OSSClient。
    ossClient.shutdown();

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

删除多个文件

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

  • 不指定versionID批量删除
    以下代码用于不指定versionId删除多个Object:
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    String bucketName = "<yourBucketName>";
    String versionid = "<yourObjectVersionid>";
    
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // 批量删除object。
    List<String> KeysList = new ArrayList<String>();
    KeysList.add("<yourObject1Name>");
    KeysList.add("<yourObject2Name>");
    DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName);
    request.setVersionId(versionid);
    request.setKeys(KeysList);
    // 发起deleteObjects请求。
    DeleteObjectsResult delObjResult = ossClient.deleteObjects(request);
    
    // 查看删除结果。
    for (String o : delObjResult.getDeletedObjects()) {
        String keyName = URLDecoder.decode(o, "UTF-8");
        System.out.println("delete key name: " + keyName);
    }
    
    // 关闭OSSClient。
    ossClient.shutdown();
  • 指定versionId批量删除
    以下代码用于删除多个指定版本Object及删除标记:
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    String bucketName = "<yourBucketName>";
    
    
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // 删除指定版本的object与删除指定版本的删除标记。
    List<KeyVersion> keyVersionsList = new ArrayList<KeyVersion>();
    keyVersionsList.add(new KeyVersion("<yourObject3Name>","<yourObject3NameVersionid>"));
    keyVersionsList.add(new KeyVersion("<yourObject4Name>","<yourObject4DelMarkerVersionid>"));
    DeleteVersionsRequest delVersionsRequest = new DeleteVersionsRequest(bucketName);
    delVersionsRequest.setKeys(keyVersionsList);
    // 发起deleteVersions请求。
    DeleteVersionsResult delVersionsResult = ossClient.deleteVersions(delVersionsRequest);
    
    // 查看删除结果。
    for (DeletedVersion delVer : delVersionsResult.getDeletedVersions()) {
      String keyName = URLDecoder.decode(delVer.getKey(), "UTF-8");
      String keyVersionId = delVer.getVersionId();
      String keyDelMarkerId = delVer.getDeleteMarkerVersionId();
      System.out.println("delete key: " + keyName);
      System.out.println("delete key versionid: " + keyVersionId);
      if(keyDelMarkerId != null && keyDelMarkerId.length() != 0){
        System.out.println("delete key del_marker versionid: " + keyDelMarkerId);
      }
    }
    
    // 关闭OSSClient。
    ossClient.shutdown();

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

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

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

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

// 指定前缀。
final String prefix = "<yourkeyPrefix>";

// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 列举所有指定前缀的文件的版本信息并删除。
String nextKeyMarker = null;
String nextVersionMarker = null;
VersionListing versionListing = null;
do {
    ListVersionsRequest listVersionsRequest = new ListVersionsRequest()
            .withBucketName(bucketName)
            .withKeyMarker(nextKeyMarker)
            .withVersionIdMarker(nextVersionMarker)
            .withPrefix(prefix);

    versionListing = ossClient.listVersions(listVersionsRequest);
    if (versionListing.getVersionSummaries().size() > 0) {
        List<KeyVersion> keyVersionsList = new ArrayList<KeyVersion>();
        for (OSSVersionSummary ossVersion : versionListing.getVersionSummaries()) {
            System.out.println("key name: " + ossVersion.getKey());
            System.out.println("versionid: " + ossVersion.getVersionId());
            System.out.println("Is delete marker: " + ossVersion.isDeleteMarker());
            keyVersionsList.add(new KeyVersion(ossVersion.getKey(), ossVersion.getVersionId()));
        }
        DeleteVersionsRequest delVersionsRequest = new DeleteVersionsRequest(bucketName).withKeys(keyVersionsList);
        ossClient.deleteVersions(delVersionsRequest);
    }

    nextKeyMarker = versionListing.getNextKeyMarker();
    nextVersionMarker = versionListing.getNextVersionIdMarker();
} while (versionListing.isTruncated());

// 关闭OSSClient。
ossClient.shutdown();