批量删除对象

  • DeleteObjects

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

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

代码示例:

// 批量删除对象
func DeleteObjects(svc *s3.S3) {
    deleteObjectsInput := &s3.DeleteObjectsInput{
        Bucket: aws.String("exampleBucket"),
        Delete: &s3.Delete{
            Objects: []*s3.ObjectIdentifier{
                {
                    Key: aws.String("exampleKey1"),
                },
                {
                    Key: aws.String("exampleKey2"),
                },
            },
            Quiet: aws.Bool(false),
        },
    }

    deleteObjectsOutput, err := svc.DeleteObjects(deleteObjectsInput)
    if err != nil {
        fmt.Printf("Failed to delete objects. %v\n", err)
    } else {
        fmt.Println(deleteObjectsOutput)
    }
}

DeleteObjectsInput可设置的参数如下:

参数 类型 说明 是否必要
Bucket *string 执行本操作的桶名称。
Delete *Delete 封装了要删除对象信息(Key、VersionId)和删除模式等信息

DeleteObjectsOutput返回的属性如下:

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

DeleteObjectsRequest操作首先生成一个"request.Request"对象,该对象是一个执行DeleteObjects操作的请求。通过调用Request对象的Send方法完成批量删除对象的操作。该方法可以生成定制化的请求,例如自定义请求头部请求超时重试设置。

代码示例:

func DeleteObjectsRequest(svc *s3.S3) {
    deleteObjectsInput := &s3.DeleteObjectsInput{
        Bucket: aws.String("exampleBucket"),
        Delete: &s3.Delete{
            Objects: []*s3.ObjectIdentifier{
                {
                    Key: aws.String("exampleKey1"),
                },
                {
                    Key: aws.String("exampleKey2"),
                },
            },
            Quiet: aws.Bool(false),
        },
    }
    req, resp := svc.DeleteObjectsRequest(deleteObjectsInput)

    err := req.Send()
    if err != nil {
        fmt.Printf("fail to delete objects. %v\n", err)
    } else {
        fmt.Println(resp)
    }
}

响应结果:

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