本文介绍如何在受版本控制的存储空间(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();
在文档使用中是否遇到以下问题
更多建议
匿名提交