对象存储BOS

    Bucket管理

    Bucket既是BOS上的命名空间,也是计费、权限控制、日志记录等高级功能的管理实体。

    • Bucket名称在所有区域中具有全局唯一性,且不能修改。

      说明: 百度智能云目前开放了多区域支持,请参考区域选择说明

      目前支持“华北-北京”、“华南-广州”和“华东-苏州”三个区域。北京区域:http://bj.bcebos.com,广州区域:http://gz.bcebos.com,苏州区域:http://su.bcebos.com

    • 存储在BOS上的每个Object都必须包含在一个Bucket中。
    • 一个用户最多可创建100个Bucket,但每个Bucket中存放的Object的数量和大小总和没有限制,用户不需要考虑数据的可扩展性。

    Bucket权限管理

    设置Bucket的访问权限

    如下代码将Bucket的权限设置为了private。

    int setBucketPrivate (Client& client, const std::string& bucketName) {
        PutBucketAclRequest request(bucketName, "private");//第二个参数为CannedACL
        PutBucketAclResponse response;
        int ret = client.put_bucket_acl(request, &response);
        //client error
        if (ret != 0) {
            return ret;
        }
        //response errro
        if (response.is_fail()) {
            printf("error-message:%s\n", response.error().message().c_str());
            return response.status_code();
        }
        return 0;
    }

    CannedACL包含三个值: privatepublic-readpublic-read-write ,它们分别对应相关权限。具体内容可以参考BOS API文档 使用CannedAcl方式的权限控制

    查看Bucket的权限

    如下代码可以查看Bucket的权限:

    GetBucketAclRequest("bucketName");
    GetBucketAclResponse response;
    int ret = client.get_bucket_acl(request, &response);
    if (response.is_fail()) {
            printf("error-message:%s\n", response.error().message().c_str());
            return;
    }
    std::string owner_id = reponse.owner().id;
    std::cout << "owner_id: " << owner_id << std::endl;
    for (const Grant& grant : response.access_control_list()) {//c++11
        do_something(grant);
    }  

    get_bucket_acl方法返回的response中可供调用的参数有:

    参数 类型 说明
    owner Owner(string) Bucket owner id
    access_control_list vector\<Grant> 保存acl的容器
    +grantee vector\<string> 被授权人ID
    +permission vector\<string> 标识被授权人的权限

    查看Bucket所属的区域

    Bucket Location即Bucket Region,百度智能云支持的各region详细信息可参见区域选择说明

    如下代码可以获取该Bucket的Location信息:

    Client client (ak, sk, config);
    
    ListBucketsRequest listBucketsRequest;
    ListBucketsResponse listBucketsResponse;
    int ret = client.list_buckets(listBucketsRequest, &listBucketsResponse)
    std::vector<BucketSummary> bucketSummaryList =  listBucketsResponse.buckets();
    if (listBucketsResponse.is_fail()) {
            printf("error-message:%s\n", listBucketsResponse.error().message().c_str());
            return ;
    }
    for(const BucketSummary& bs : bucketSummaryList){
        std::cout << "name: " << bs.name << 
            " location: " << bs.location << std::endl;
    }
    
    GetBucketLocationRequest getBucketLocationRequest("bucketName");
    GetBucketLocationResponse getBucketLocationResponse;
    ret = client.get_bucket_location(getBucketLocationRequest, 
                        &getBucketLocationResponse);
    if (getBucketLocationResponse.is_fail()) {
            printf("error-message:%s\n", response.error().message().c_str());
            return;
    }
    std::cout << "location: " << getBucketLocationResponse.location() << std::endl;

    新建Bucket

    如下代码可以新建一个Bucket:

    int createBucket (Client& client, const std::string& bucketName) {
        // 新建一个Bucket
        PutBucketRequest request(bucketName);
        PutBucketResponse response;
        int ret = client.put_bucket(request, &response);
        if (ret !=0) {
            return ret;
        }
        if (response.is_fail()) {
            printf("error-message:%s\n", response.error().message().c_str());
        }
        return ret;
    }
    int main() {
        std::sting ak = "ak";
        std::string sk = "sk";
        Client client(ak, sk);
        int ret = createBucket(client, "bucketName");
        std::string ret_info = stringfy_ret_code(ret);
        std::cout << ret_info << std::endl;
    }

    注意: 由于Bucket的名称在所有区域中是唯一的,所以需要保证bucketName不与其他所有区域上的Bucket名称相同。

    Bucket的命名有以下规范:

    • 只能包括小写字母,数字,短横线(-)。
    • 必须以小写字母或者数字开头。
    • 长度必须在3-63字节之间。

    通过上述代码创建的bucket,权限是私有读写,存储类型是标准类型(Standard)。

    列举Bucket

    如下代码可以列出用户所有的Bucket:

    int listBuckets (Client& client) {
        // 获取用户的Bucket列表
        ListBucketsRequest listBucketsRequest;
        ListBucketsResponse listBucketsResponse;
        int ret = client.list_buckets(listBucketsRequest, &listBucketsResponse)
        std::vector<BucketSummary> bucketSummaryList = listBucketsResponse.buckets();
        if (listBucketsResponse.is_fail()) {
            printf("error-message:%s\n", listBucketsResponse.error().message().c_str());
            return ret;
        }
        // 遍历Bucket
        for(const BucketSummary& bs : bucketSummaryList){
            std::cout << "bucketName: " << bs.name <<  std::endl;
        }
        return ret;
    } 

    删除Bucket

    如下代码可以删除一个Bucket:

    int deleteBucket (Client& client, const std::string& bucketName) {
        // 删除Bucket
        DeleteBucketRequest request(bucketName);
        DeleteBucketResponse response;
        int ret = client.delete_bucket(request, &response);
        if (response.is_fail()) {
            printf("error-message:%s\n", listBucketsResponse.error().message().c_str());
        }
        return ret;
    }

    注意:

    • 在删除前需要保证此Bucket下的所有Object和未完成的三步上传Part已经被删除,否则会删除失败。
    • 在删除前确认该Bucket没有开通跨区域复制,不是跨区域复制规则中的源Bucket或目标Bucket,否则不能删除。

    判断Bucket是否存在

    若用户需要判断某个Bucket是否存在,则如下代码可以做到:

    //0 表示check成功,bucket存在
    //-1不存在
    //other其他错误,具体error-message给出
    int checkBucketExist (Client& client, const std::string& bucketName) {
        bool exist = false;
        // 获取Bucket的存在信息
        HeadBucketRequest request(bucketName);
        HeadBucketResponse response;
        int ret = client.head_bucket(request, &response);
        if (response.is_fail() && response.status_code() != 404){
            printf("error-message:%s\n", response.error().message().c_str());
            return ret; 
        } else if (response.status_code() == 404){
            return -1;
        }
        //200 ok
        return 0;
    }

    注意: 如果Bucket不为空(即Bucket中有Object存在),则Bucket无法被删除,必须清空Bucket后才能成功删除。

    上一篇
    初始化
    下一篇
    文件管理