对象业务的批量删除接口

AWS S3提供了删除单个对象和批量删除对象的接口,如下:

  • DeleteObject
    请求消息的格式,如下:

    DELETE /Key+?versionId=VersionId HTTP/1.1
    Host: Bucket.s3.amazonaws.com
    x-amz-mfa: MFA
    x-amz-request-payer: RequestPayer
    x-amz-bypass-governance-retention: BypassGovernanceRetention
    x-amz-expected-bucket-owner: ExpectedBucketOwner
    

    响应消息的格式,如下:

    HTTP/1.1 204
    x-amz-delete-marker: DeleteMarker
    x-amz-version-id: VersionId
    x-amz-request-charged: RequestCharged
    
  • DeleteObjects
    本接口提供批量删除能力,要求客户提供对象名和版本号,不支持前缀。
    请求消息的格式,如下:

    POST /?delete HTTP/1.1
    Host: Bucket.s3.amazonaws.com
    x-amz-mfa: MFA
    x-amz-request-payer: RequestPayer
    x-amz-bypass-governance-retention: BypassGovernanceRetention
    x-amz-expected-bucket-owner: ExpectedBucketOwner
    x-amz-sdk-checksum-algorithm: ChecksumAlgorithm
    <?xml version="1.0" encoding="UTF-8"?>
    <Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Object>
        <Key>string</Key>
        <VersionId>string</VersionId>
    </Object>
    ...
    <Quiet>boolean</Quiet>
    </Delete>
    

    响应消息的格式,如下:

    HTTP/1.1 200
    x-amz-request-charged: RequestCharged
    <?xml version="1.0" encoding="UTF-8"?>
    <DeleteResult>
    <Deleted>
        <DeleteMarker>boolean</DeleteMarker>
        <DeleteMarkerVersionId>string</DeleteMarkerVersionId>
        <Key>string</Key>
        <VersionId>string</VersionId>
    </Deleted>
    ...
    <Error>
        <Code>string</Code>
        <Key>string</Key>
        <Message>string</Message>
        <VersionId>string</VersionId>
    </Error>
    ...
    </DeleteResult>
    

使用上述接口时,需要明确指定对象名,对象的版本号可选。
对于一些客户来说,现有的应用基于文件协议开发,依赖递归删除目录和文件的语义,依据前述接口对现有应用整改,工作量巨大,因此基于对象语义的规则,扩充现有的对象存储服务的接口,提供类似rm -rf /tmp/aa/的能力,满足客户的诉求。

接口定义

参考ListObjectsV2,给出如下接口定义:

请求消息

POST /?delete&continuation-token=ContinuationToken&delimiter=Delimiter&encoding-type=EncodingType&fetch-owner=FetchOwner&max-keys=MaxKeys&prefix=Prefix&start-after=StartAfter HTTP/1.1
Host: Bucket.s3.amazonaws.com

响应消息

HTTP/1.1 200
x-amz-request-charged: RequestCharged
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult>
<IsTruncated>boolean</IsTruncated>
<Contents>
    <ETag>string</ETag>
    <Key>string</Key>
    <LastModified>timestamp</LastModified>
    <Owner>
        <DisplayName>string</DisplayName>
        <ID>string</ID>
    </Owner>
    <Size>long</Size>
</Contents>
...
<Name>string</Name>
<Prefix>string</Prefix>
<Delimiter>string</Delimiter>
<MaxKeys>integer</MaxKeys>
<CommonPrefixes>
    <Prefix>string</Prefix>
</CommonPrefixes>
...
<EncodingType>string</EncodingType>
<KeyCount>integer</KeyCount>
<ContinuationToken>string</ContinuationToken>
<NextContinuationToken>string</NextContinuationToken>
<StartAfter>string</StartAfter>
</ListBucketResult>

在响应消息中,使用isTruncated字段来标识目录下是否仍然存在文件,取值为false,表示目录下的文件已全部被删除。

技术限制

  • 使用本接口批量删除对象,单次删除的对象数量的上限为1000。
  • 本接口的定义中没有对象名和版本号,因此不能用于删除对象的历史版本。
posted @ 2024-07-25 08:00  jackieathome  阅读(21)  评论(0编辑  收藏  举报