删除对象

删除单个对象

DeleteObject操作用于删除一个object。对于开启版本控制的Bucket执行删除对象操作时,如果未指定versionId ,则保留对象的当前版本,并插入删除标记(Delete Marker)。如果指定versionId,则永久删除该指定版本ID的对象。如果在未指定versionId的情况下执行DeleteObject操作时,默认仅作用于对象的当前版本,但不会直接删除该对象的当前版本,而是插入一个删除标记(Delete Marker),并保留原来的当前版本。当执行GetObject操作时,OSS会检测到当前版本为删除标记,并返回404 NotFound。

代码示例:

using System;
using System.Threading.Tasks;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;

namespace DotNetSDK.ObjectOperation
{
    public class DeleteObjectExample
    {
        public static async Task DeleteObject()
        {
            var accessKey = "YOUR_ACCESS_KEY";
            var secretKey = "YOUR_SECRET_KEY";
            var endpoint = "YOUR_ENDPOINT";
            var bucketName = "EXAMPLE_BUCKET";
            var key = "EXAMPLE_KEY";
            var credentials = new BasicAWSCredentials(accessKey, secretKey);
            try
            {
                var conf = new AmazonS3Config
                {
                    ServiceURL = endpoint
                };
                var s3Client = new AmazonS3Client(credentials, conf);

                var deleteObjectRequest = new DeleteObjectRequest()
                {
                    BucketName = bucketName,
                    Key = key
                };
                var result = await s3Client.DeleteObjectAsync(deleteObjectRequest);
                if (result.HttpStatusCode != System.Net.HttpStatusCode.NoContent)
                {
                    Console.WriteLine("fail to delete object {0}, HttpStatusCode:{1}, ErrorCode:{2}.", key, (int) result.HttpStatusCode, result.HttpStatusCode);
                }

                Console.WriteLine("deleted object {0}.", key);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

DeleteObject可设置的参数如下:

参数 类型 说明 是否必要
BucketName string bucket的名称。
Key string 对象的key。
VersionId string 用于指定要删除对象的versionId

DeleteObjectOutput返回的结果如下:

参数 类型 说明
DeleteMarker string 有效值为true。在桶开启版本控制的情况下,执行DeleteObject 操作时如果未指定对象的版本Id,OSS会创建删除标记,此时DeleteMarker为true。如果指定对象的版本Id来永久删除指定对象版本时,若该版本Id是删除标记,则DeleteMarker也为true。其他情况下DeleteMarker的值为空。
VersionId string 执行DeleteObject操作时如果未指定对象的版本Id,OSS会创建删除标记,VersionId为删除标记的版本Id。 如果指定版本Id来永久删除对象指定版本时,返回的VersionId为对象的版本Id。

响应结果:

HTTP状态码 响应码 描述
204 NoContent 操作成功。
403 AccessDenied 用户没有权限执行操作。
404 NoSuchBucket 操作指定的bucket不存在。

批量删除对象

DeleteObjects操作可以实现通过一个HTTP请求批量删除多个对象的功能,可以减少发起多起请求去删除大量对象的花销。DeleteObjects操作发起一个包含了最多1000个key的删除请求,媒体存储服务会对相应的对象逐个进行删除,并且将删除成功或者失败的结果通过response返回。如果请求删除的对象不存在,会返回已删除的结果。

DeleteObjects操作返回verbose和quiet两种response模式。 verbose response是默认的返回模式,该模式的返回结果包含了每个key的删除结果。quiet response返回模式返回的结果仅包含了删除失败的key,对于一个完全成功的删除操作,该返回模式不在相应消息体中返回任何信息。

代码示例:

using System;
using System.Threading.Tasks;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;

namespace DotNetSDK.ObjectOperation
{
    public class DeleteObjectsExample
    {
        public static async Task DeleteObjects()
        {
            var accessKey = "YOUR_ACCESS_KEY";
            var secretKey = "YOUR_SECRET_KEY";
            var endpoint = "YOUR_ENDPOINT";
            var bucketName = "EXAMPLE_BUCKET";
            try
            {
                var credentials = new BasicAWSCredentials(accessKey, secretKey);
                var conf = new AmazonS3Config
                {
                    ServiceURL = endpoint
                };
                var s3Client = new AmazonS3Client(credentials, conf);
                DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest()
                {
                    BucketName = bucketName,
                    Quiet = false
                };
                deleteObjectsRequest.AddKey("key1");
                deleteObjectsRequest.AddKey("key2");

                var result = await s3Client.DeleteObjectsAsync(deleteObjectsRequest);
                Console.WriteLine("HttpStatusCode:{0}, {1}", (int) result.HttpStatusCode, result.HttpStatusCode);
                //打印删除成功的对象信息
                foreach (var deletedObject in result.DeletedObjects)
                {
                    Console.WriteLine("Key:{0}, DeleteMarker:{1}, VersionId:{2}, DeleteMarkerVersionId:{3}.", deletedObject.Key, deletedObject.DeleteMarker, deletedObject.VersionId,
                        deletedObject.DeleteMarkerVersionId);
                }

                //打印删除失败的对象信息
                foreach (var deleteError in result.DeleteErrors)
                {
                    Console.WriteLine("Code:{0}, Key:{1}, Message:{2}, VersionId:{3}", deleteError.Code, deleteError.Key, deleteError.Message, deleteError.VersionId);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

DeleteObjectsRequest可设置的参数如下:

参数 类型 说明 是否必要
BucketName string bucket的名称。
Quiet bool 设置为ture表示采用返回结果为quiet response模式,设置为false表示返回结果为verbose response模式。

DeleteObjects返回的结果如下:

参数 类型 说明
Deleted List<DeletedObject> 被删除对象信息的数组,数组中每一项包含了一个被成功删除的对象的信息,包括删除标记、对象key和版本id等信息。
Errors List<DeleteError> 删除失败的对象信息的数组,数组中每一项包含了一个删除失败的对象的信息,包括错误码、对象key和版本id等信息。
RequestCharged *string 如果返回结果中包含该属性,表示请求的发起者对该次请求操作付费。

响应结果:

HTTP状态码 响应码 描述
200 OK 操作成功。
400 BadRequest 当前资源池暂不支持批量删除对象操作。
403 Forbidden 用户没有权限执行操作。