所有文档

          对象存储 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:

          client.set_bucket_canned_acl(bucket_name, "private")

          canned acl支持三种权限,分别为:privatepublic-readpublic-read-write。关于权限的具体内容可以参考《BOS API文档 使用CannedAcl方式的权限控制》。

          设置指定用户对Bucket的访问权限

          BOS提供set_bucket_acl方法来实现指定用户对Bucket的访问权限设置,可以参考如下代码实现:

          acl = [{'grantee' => [{'id' => 'b124deeaf6f641c9ac27700b41a350a8'},
                                {'id' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'}],
                  'permission' => ['FULL_CONTROL']
          }]
          
          client.set_bucket_acl(bucket_name, acl)

          注意:

          1. permission中的权限设置包含三个值:READWRITEFULL_CONTROL,它们分别对应相关权限。具体内容可以参考《BOS API文档 上传ACL文件方式的权限控制》。
          2. 设置两个以上(含两个)被授权人时,请参考以上示例的格式,若将数组合并会返回报错。

          设置更多Bucket访问权限

          1. 通过设置referer白名单方式设置防盗链

            acl = [{'grantee' => [{'id' => 'b124deeaf6f641c9ac27700b41a350a8'},
                                  {'id' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'}],
                    'permission' => ['FULL_CONTROL'],
                    'condition' => {
                        'referer' => {
                            'stringLike' => ['http://www.abc.com/*'],
                            'stringEquals' => ['http://www.abc.com']
                         }
                    }
            }]
            
            client.set_bucket_acl(bucket_name, acl)
          2. 限制客户端IP访问,只允许部分客户端IP访问

            acl = [{'grantee' => [{'id' => 'b124deeaf6f641c9ac27700b41a350a8'},
                                  {'id' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'}],
                    'permission' => ['FULL_CONTROL'],
                    'condition' => {
                        "ipAddress" => [
                              '192.168.0.0/16',
                              '192.169.0.*',
                              '192.170.0.5'
                        ]
                    }
            }]
            
            client.set_bucket_acl(bucket_name, acl)

          设置STS临时token权限

          对于通过STS方式创建的临时访问身份,管理员也可进行专门的权限设定。 STS的简介及设置临时权限的方式可参见临时授权访问

          使用BOS Ruby SDK设置STS临时token权限可参考使用STS创建BosClient

          查看Bucket的权限

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

          client.get_bucket_acl(bucket_name)

          get_bucket_acl方法返回的解析类中可供调用的参数有:

          参数 说明
          owner Bucket owner信息
          id Bucket owner的用户ID
          acl 标识Bucket的权限列表
          grantee 标识被授权人
          -id 被授权人ID
          permission 标识被授权人的权限

          查看Bucket所属的区域

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

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

          client.get_bucket_location(bucket_name)

          新建Bucket

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

          bucketName = "your_bucket";
          
          # Bucket是否存在,若不存在创建Bucket
          client.create_bucket(bucket_name) unless client.does_bucket_exist(bucket_name)

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

          Bucket的命名有以下规范:

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

          通过上述代码创建的bucket,权限是私有读写,存储类型是标准类型(Standard)。用户在控制台创建Bucket时可以指定Bucket权限和存储类型。

          列举Bucket

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

          buckets = client.list_buckets()

          删除Bucket

          删除指定Bucket

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

          bucketName = "your_bucket";
          client.delete_bucket(bucketName)

          注意:

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

          删除所有Bucket

          delete_bucketlist_buckets函数结合,可以删除全部Bucket,参考代码如下:

          # 列出全部Bucket
          buckets = client.list_buckets()['buckets']
          
          # 遍历删除全部Bucket
          buckets.each do |bucket|
              while true
                  options = {}
                  res = client.list_objects(bucket['name'], options)
                  res['contents'].each do |object|
                      client.delete_object(bucket['name'], object['key'])
                  end
                  if res['isTruncated']
                      options[:marker] = res['nextMarker']
                  else
                      break
                  end
              end
              client.delete_bucket(bucket['name'])
          end

          判断Bucket是否存在

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

          client.does_bucket_exist(bucketName)
          上一篇
          初始化
          下一篇
          文件管理