本文介绍如何在受版本控制的存储空间(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进行永久删除:
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    String bucketName = "<yourBucketName>";
    // Object所在存储空间的完整名称,即包含文件后缀在内的完整路径,例如example/test.jpg。
    String objectName = "<yourObjectName>";
    // 可以传入Object的版本id,也可以传入删除标记的版本id。
    String versionid = "<yourObjectVersionidOrDelMarkerVersionid>";
    
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // 删除指定版本的Object。
    ossClient.deleteVersion(bucketName, objectName , versionid);
    
    // 关闭OSSClient。
    ossClient.shutdown();
  • 临时删除
    以下代码用于不指定versionId对Object进行临时删除:
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建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

删除多个文件

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

  • 永久删除
    以下代码用于指定versionId对多个Object及删除标记进行永久删除:
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建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();
  • 临时删除
    以下代码用于不指定versionId对多个Object进行临时删除:
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建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.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();

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

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

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

// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建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();