C SDK开发指南

Size: px
Start display at page:

Download "C SDK开发指南"

Transcription

1 文档版本 04 发布日期 华为技术有限公司

2 版权所有 华为技术有限公司 2019 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束, 本文档中描述的全部或部分产品 服务或特性可能不在您的购买或使用范围之内 除非合同另有约定, 华为公司对本文档内容不做任何明示或默示的声明或保证 由于产品版本升级或其他原因, 本文档内容会不定期进行更新 除非另有约定, 本文档仅作为使用指导, 本文档中的所有陈述 信息和建议不构成任何明示或暗示的担保 文档版本 04 ( ) 版权所有 华为技术有限公司 i

3 目录 目录 1 相关资源 SDK 下载 兼容性 技术支持渠道 快速入门 使用前需知 OBS 服务环境搭建 服务地址 初始化 option 创建桶 上传对象 下载对象 列举对象 删除对象 初始化 配置密钥 初始化 SDK 配置 option 配置 SDK 日志 配置 SDK 验证服务端证书 管理桶 创建桶 列举桶 删除桶 判断桶是否存在 管理桶访问权限 获取桶存量信息 桶配额 桶存储类型 上传对象 流式上传 文件上传 文档版本 04 ( ) 版权所有 华为技术有限公司 ii

4 目录 5.3 创建文件夹 设置对象属性 分段上传 分段复制 断点续传上传 追加写 下载对象 对象下载 限定条件下载 下载归档存储对象 断点续传下载 图片处理 管理对象 获取对象属性 管理对象访问权限 列举对象 删除对象 复制对象 临时授权访问 什么是临时授权访问 临时授权访问 生成创建桶的 URL 生成上传对象的 URL 生成下载对象的 URL 生成列举对象的 URL 生成删除对象的 URL 多版本控制 多版本控制简介 设置桶多版本状态 查看桶多版本状态 获取多版本对象 复制多版本对象 取回多版本归档存储对象 列举多版本对象 多版本对象权限 删除多版本对象 生命周期管理 生命周期管理简介 设置生命周期规则 查看生命周期规则 文档版本 04 ( ) 版权所有 华为技术有限公司 iii

5 目录 10.4 删除生命周期规则 跨域资源共享 跨域资源共享简介 设置跨域规则 查看跨域规则 删除跨域规则 设置访问日志 日志简介 开启桶日志 查看桶日志配置 关闭桶日志 静态网站托管 静态网站托管简介 网站文件托管 设置托管配置 查看托管配置 清除托管配置 标签管理 标签简介 设置桶标签 查看桶标签 删除桶标签 事件通知 事件通知简介 设置事件通知 查看事件通知 关闭事件通知 服务端加密 服务端加密简介 加密说明 加密示例 异常处理 OBS 服务端错误码 SDK 错误处理 日志分析 签名不匹配异常 HTTP 状态码报 A 修订记录 文档版本 04 ( ) 版权所有 华为技术有限公司 iv

6 1 相关资源 1 相关资源 1.1 SDK 下载 OBS C SDK 最新版本源码 : 最新源码下载 OBS C SDK 历史版本下载 : 历史版本下载 1.2 兼容性 3.*.* 相对于 兼容 3.*.* 不兼容 2.*.* 3.*.* 不兼容 1.*.* arm 编译环境 : NAME="EulerOS" VERSION="2.0 (SP8)" ID="euleros" ID_LIKE="rhel fedora centos" VERSION_ID="2.0" PRETTY_NAME="EulerOS 2.0 (SP8)" ANSI_COLOR="0;31" 内核版本 : vhulk h276.eulerosv2r8.aarch64 gcc/g++ 版本 : gcc (GCC) 7.3.0/g++ (GCC) linux 编译环境 : NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL=" BUG_REPORT_URL=" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7" 文档版本 04 ( ) 版权所有 华为技术有限公司 1

7 1 相关资源 内核版本 : el7.x86_64 gcc/g++ 版本 : gcc (GCC) 4.8.5/g++ (GCC) 说明 SDK 二进制包编译环境如上, 其余内核和操作系统的兼容性不做保证 如果有其它操作系统或者内核版本的需求, 请使用开源代码自行编译 1.3 技术支持渠道 开发者社区提供的技术支持渠道如下 : 开发过程中, 您有任何问题可以在华为云论坛中发帖求助 文档版本 04 ( ) 版权所有 华为技术有限公司 2

8 2 快速入门 2 快速入门 2.1 使用前需知 请确认您已经熟悉 OBS 的基本概念, 如桶 (Bucket) 对象 (Object) 访问密钥 (AK 和 SK) 等 使用 OBS 客户端进行接口调用操作完成后, 没有返回异常, 则表明接口调用成功 ; 若返回异常, 则说明操作失败, 此时应从 17.2 SDK 错误处理中获取错误信息 当前各区域特性开放不一致, 部分特性只在部分区域开放, 使用过程中若接口 HTTP 状态码为 405, 请确认该区域是否支持该功能特性 2.2 OBS 服务环境搭建 步骤 1 注册云服务账号 使用 OBS 之前必须要有一个云服务账号 1. 打开浏览器 2. 登录公有云网站 3. 在页面右上角单击 注册 4. 按需填写注册信息并单击 同意协议并注册 步骤 2 开通 OBS 服务 使用 OBS 服务之前必须先充值, 才能正常使用 OBS 服务 1. 登录 OBS 管理控制台 2. 单击页面右上角的 费用 进入费用中心页面 3. 单击 充值, 系统自动跳转到充值窗口 4. 根据界面提示信息, 对账户进行充值 5. 充值成功后, 关闭充值窗口, 返回管理控制台首页 6. 单击, 开通并进入 OBS 管理控制台 步骤 3 创建访问密钥 文档版本 04 ( ) 版权所有 华为技术有限公司 3

9 2 快速入门 OBS 通过用户账号中的 AK 和 SK 进行签名验证, 确保通过授权的账号才能访问指定的 OBS 资源 以下是对 AK 和 SK 的解释说明 : AK:Access Key ID, 接入键标识, 用户在系统中的接入键标识, 一个接入键标识唯一对应一个用户, 一个用户可以同时拥有多个接入键标识 系统通过接入键标识识别访问系统的用户 SK:Secret Access Key, 安全接入键, 用户在系统中的安全接入键, 是用户访问系统的密钥, 用户根据安全接入键和请求头域生成鉴权信息 安全接入键和接入键标识一一对应 访问密钥分永久访问密钥 (AK/SK) 和临时访问密钥 (AK/SK 和 SecurityToken) 两种 永久访问密钥自创建后一年内有效, 且每个用户最多可创建两个有效的访问密钥 临时访问密钥只在设置的有效期内能够访问 OBS, 过期后需要重新获取 出于安全性考虑, 建议您使用临时访问密钥访问 OBS, 或使用永久访问密钥访问 OBS 时, 定期更新您的访问密钥 (AK/SK) 两种密钥的获取方式如下 永久访问密钥 : a. 登录 OBS 控制台 b. 单击页面右上角的用户名, 并选择 我的凭证 c. d. 在 我的凭证 页面, 单击左侧导航栏的 访问密钥 e. 在 访问密钥 页面, 单击 新增访问密钥 f. 在弹出的 新增访问密钥 对话框中, 输入登录密码和对应验证码 说明 用户如果未绑定邮箱和手机, 则只需输入登录密码 用户如果同时绑定了邮箱和手机, 可以选择其中一种方式进行验证 g. 单击 确定 h. 在弹出的 下载确认 提示框中, 单击 确定 后, 密钥会直接保存到浏览器默认的下载文件夹中 i. 打开下载下来的 credentials.csv 文件既可获取到访问密钥 (AK 和 SK) 说明 临时访问密钥 : ---- 结束 每个用户最多可创建两个有效的访问密钥 为防止访问密钥泄露, 建议您将其保存到安全的位置 如果用户在此提示框中单击 取消, 则不会下载密钥, 后续也将无法重新下载 如果需要使用访问密钥, 可以重新创建新的访问密钥 临时 AK/SK 和 SecurityToken 是系统颁发给用户的临时访问令牌, 通过接口设置有效期, 范围为 15 分钟至 24 小时, 过期后需要重新获取 临时 AK/SK 和 SecurityToken 遵循权限最小化原则 使用临时 AK/SK 鉴权时, 临时 AK/SK 和 SecurityToken 必须同时使用 获取临时访问密钥的接口请参考获取临时 AK/SK 和 securitytoken 使用临时访问密钥的方法请参考临时访问密钥创建并初始化 option 代码 文档版本 04 ( ) 版权所有 华为技术有限公司 4

10 2 快速入门 2.3 服务地址 您可以从这里查看 OBS 当前开通的服务地址和区域信息 2.4 初始化 option 2.5 创建桶 在调用 C SDK 的功能函数时, 都要传入 option 参数, 您可通过 init_obs_options 函数初始化 option 配置, 通过 option 设置 AK SK Endpoint bucket 超时时间 临时鉴权 : 永久访问密钥 (AK/SK) 创建并初始化 option 如下 : 临时访问密钥 (AK/SK 和 SecurityToken) 创建并初始化 option 如下 : option.bucket_options.token = "<Your SecurityToken>"; 桶是 OBS 全局命名空间, 相当于数据的容器 文件系统的根目录, 可以存储若干对象 以下代码展示如何新建一个桶 : static void test_create_bucket(obs_canned_acl canned_acl, char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; // 设置 obs.xxx.com 响应回调函数 obs_response_handler response_handler = 0, &response_complete_callback // 创建桶,< 预定义访问策略 > 值参考 5.5 管理桶访问权限 create_bucket(&option, "<bucket ACL>", NULL, &response_handler, &ret_status); if (ret_status == OBS_STATUS_OK) printf("create bucket successfully. \n"); printf("create bucket failed(%s).\n", obs_get_status_name(ret_status)); 文档版本 04 ( ) 版权所有 华为技术有限公司 5

11 2 快速入门 说明 桶的名字是全局唯一的, 所以您需要确保不与已有的桶名称重复 桶命名规则如下 : 3~63 个字符, 数字或字母开头, 支持小写字母 数字 -. 禁止使用 IP 地址 禁止以 - 或. 开头及结尾 禁止两个. 相邻 ( 如 : my..bucket ) 禁止. 和 - 相邻 ( 如 : my-.bucket 和 my.-bucket ) 同一用户多次创建同名桶不会报错, 创建的桶属性以第一次请求为准 本示例创建的桶的访问权限默认是私有读写, 存储类型默认是标准类型, 区域位置为全局域名所在的默认区域 更多创建桶的信息, 请参见 4.1 创建桶 创建桶时, 如果使用的终端节点归属于默认区域华北 - 北京一 (cn-north-1), 则可以不指定区域 ; 否则, 如果使用的终端节点归属于其他区域, 则必须指定区域, 且指定的区域必须与终端节点归属的区域一致 当前有效的区域名称有 :cn-north-1 cn-east-2 cn-south-1 ap-southeast-1 您可以使用带参数创建方式, 在创建桶时, 指定桶的区域位置 2.6 上传对象 数据流保存到 callback_data( 参见 5.1 流式上传中的参数描述 ) 中, 使用结构体 obs_put_object_handler 中定义的回调函数 put_object_data_callback 把上传对象的内容拷贝到该回调函数的参数字符指针参数 buffer 中 以下代码展示了如何进行对象上传 : static void test_put_object_from_buffer() // 待上传 buffer char *buffer = "abcdefg"; // 待上传 buffer 的长度 int buffer_size = strlen(buffer); // 上传的对象名 char *key = "put_buffer_test"; // 初始化 option option.bucket_options.host_name = "<your-endpoint; option.bucket_options.bucket_name = "<Your bucket name>"; // 初始化上传对象属性 obs_put_properties put_properties; init_put_properties(&put_properties); // 自定义存储上传数据的结构体, put_buffer_object_callback_data data; memset(&data, 0, sizeof(put_buffer_object_callback_data)); // 把 buffer 赋值到上传数据结构中 data.put_buffer = buffer; // 设置 buffersize data.buffer_size = buffer_size; // 设置回调函数, 需要实现对应的回调函数 obs_put_object_handler putobjecthandler = &response_properties_callback, &put_buffer_complete_callback, 文档版本 04 ( ) 版权所有 华为技术有限公司 6

12 2 快速入门 &put_buffer_data_callback put_object(&option, key, buffer_size, &put_properties,0,&putobjecthandler,&data); if (OBS_STATUS_OK == data.ret_status) printf("put object from buffer successfully. \n"); printf("put object from buffer failed(%s).\n", obs_get_status_name(data.ret_status)); 说明 更多上传对象的信息, 请参见上传对象 2.7 下载对象 以下代码展示了如何进行对象下载 : static void test_get_object() char *file_name = "./test"; obs_object_info object_info; // 初始化 option // 设置下载的对象 memset(&object_info, 0, sizeof(obs_object_info)); object_info.key = "<object key>"; object_info.version_id = "<object version ID>"; // 根据业务需要, 自定义存放下载对象数据的结构 get_object_callback_data data; data.ret_status = OBS_STATUS_BUTT; data.outfile = write_to_file(file_name); // 定义范围下载参数 obs_get_conditions getcondition; memset(&getcondition, 0, sizeof(obs_get_conditions)); init_get_properties(&getcondition); // 自定义下载的回调函数 obs_get_object_handler get_object_handler = &response_properties_callback, &get_object_complete_callback, &get_object_data_callback get_object(&option, &object_info, &getcondition, 0, &get_object_handler, &data); if (OBS_STATUS_OK == data.ret_status) printf("get object successfully. \n"); printf("get object faied(%s).\n", obs_get_status_name(data.ret_status)); fclose(data.outfile); 说明 更多下载对象的信息, 请参见下载对象 2.8 列举对象 以下代码展示了如何列举对象 : 文档版本 04 ( ) 版权所有 华为技术有限公司 7

13 2 快速入门 static void test_list_bucket_objects() // 设置响应回调函数 obs_list_objects_handler list_bucket_objects_handler = &response_properties_callback, &listobjects_complete_callback, &list_objects_callback // 用户自定义回调数据 list_bucket_callback_data data; memset(&data, 0, sizeof(list_bucket_callback_data)); // 列举对象 list_bucket_objects(&option, "<prefix>", "<marker>", "<delimiter>", "<maxkeys>", &list_bucket_objects_handler, &data); if (OBS_STATUS_OK == data.ret_status) printf("list bucket objects successfully. \n"); printf("list bucket objects failed(%s).\n", obs_get_status_name(data.ret_status)); 说明 更多列举对象的信息, 请参见 :7.3 列举对象 2.9 删除对象 以下代码展示了如何删除对象 : static void test_delete_object() obs_status ret_status = OBS_STATUS_BUTT; // 创建并初始化对象信息 obs_object_info object_info; memset(&object_info, 0, sizeof(obs_object_info)); object_info.key = "<Your Key>"; // 设置响应回调函数 obs_response_handler resqonsehandler = &response_properties_callback, &response_complete_callback // 删除对象 delete_object(&option,&object_info,&resqonsehandler, &ret_status); if (OBS_STATUS_OK == ret_status) printf("delete object successfully. \n"); 文档版本 04 ( ) 版权所有 华为技术有限公司 8

14 2 快速入门 说明 printf("delete object failed(%s).\n", obs_get_status_name(ret_status)); 更多删除对象的信息, 请参见 :7.4 删除对象 文档版本 04 ( ) 版权所有 华为技术有限公司 9

15 3 初始化 3 初始化 3.1 配置密钥 要接入 OBS 服务, 您需要拥有一组有效的访问密钥 (AK 和 SK) 用来进行签名认证 具体可参考 2.2 OBS 服务环境搭建 获取 AK 和 SK 之后, 您便可以按照以下步骤进行初始化 3.2 初始化 SDK OBS 客户端 (ObsClient) 是访问 OBS 服务的 C 客户端, 它为调用者提供一系列与 OBS 服务进行交互的接口, 用于管理 操作桶 (Bucket) 和对象 (Object) 等 OBS 服务上的资源 使用 OBS C SDK 发起 OBS 请求, 您需要先调用初始化接口, 在进程退出的时候调用取消初始化的接口, 释放资源 在使用 C SDK 前要先调用初始化接口 obs_initialize, 而且主进程中只能调用一次 : obs_status ret_status = OBS_STATUS_BUTT; ret_status = obs_initialize(obs_init_all); if (OBS_STATUS_OK!= ret_status) printf("obs_initialize failed(%s).\n", obs_get_status_name(ret_status)); return ret_status; 3.3 配置 option 在调用 C SDK 的功能函数时, 都要传入 obs_options 参数, 您可通过 init_obs_options 函数初始化 obs_options 配置, 通过 obs_options 设置 AK SK Endpoint bucket 超时时间 临时鉴权 obs_options 主要包括 obs_bucket_context 和 obs_http_request_option 两个结构, 可以设置的参数见下表 : 文档版本 04 ( ) 版权所有 华为技术有限公司 10

16 3 初始化 表 3-1 obs_options.obs_bucket_context 参数 参数描述默认值建议值 host_name 请求使用的主机名, 是指存放资源的服务器的域名 NULL - bucket_name 操作的桶名 NULL - protocol 请求使用的协议类型 : http https http: OBS_PROTOCOL_HTTP 默认值 access_key secret_access_key certificate_info 连接的 AK 鉴权使用的 SK, 可用于字符串的签名 双向认证使用的证书内容 如果此参数为 NULL, 则不进行证书校验 ; 如果此参数不为空, 则进行证书校验 NULL - NULL - NULL - obs_storage_class 在 PUT,POST 请求中, 需要配置存储类型时设置此参数 标准存储 : OBS_STORAGE_CLASS_S TANDARD 默认值 token 临时访问密钥的 SecurityToken NULL - 表 3-2 obs_options.obs_http_request_option 参数 参数描述默认值建议值 connect_time max_connected_ti me proxy_auth 建立 HTTP/HTTPS 连接的超时时间 ( 单位 : 毫秒 ) 默认为 毫秒 请求超时时间 ( 单位 : 秒 ) 0 代表永远不会断开链接 代理认证信息, 格式 username:password 60 [10, 60] 0 0 NULL - proxy_host 代理服务器 NULL - 说明 如网络状况不佳, 建议增大 connect_time 和 max_connected_time 的值 文档版本 04 ( ) 版权所有 华为技术有限公司 11

17 3 初始化 3.4 配置 SDK 日志 OBS C SDK 的日志路径是通过 OBS.ini 中 LogPath 字段指定的, 默认存放于与 C SDK 动态库 lib 目录同级的 logs 目录中 3.5 配置 SDK 验证服务端证书 OBS C SDK 提供了对服务端证书验证的支持, 以确保 OBS 服务来自于受信服务端 配置验证服务端证书的步骤如下 : 说明 如果访问的 OBS 服务端的根证书是由权威机构颁发的, 可以忽略步骤 1,2(C SDK 的证书库中默认已加入了权威机构的根证书 ) 步骤 1 步骤 2 步骤 3 获取 OBS 服务端的根证书 ( 例如从 IE 浏览器的 Internet 属性 > 内容 > 证书 中导出 ), 并保存为文件 obs.cer 把 obs.cer 证书保存到特定目录 应用程序使用 https 协议通信, 接口调用方法参考 HTTPS 服务接口使用方法 ---- 结束 HTTPS 服务接口使用方法 1. 您可以在 init_obs_options 之前调用 init_certificate_by_path 实现 https 通信, 根证书路径通过参数指定或者使用系统默认证书 参数描述 字段名类型约束说明 protocol obs_protocol 协议参数 值为 OBS_PROTOCOL_HTTPS 或 OBS_PROTOCOL_HTTP ca_conf obs_certifica te_conf 可选, 如果 protocol 为 OBS_PROTOCOL_HT TPS 则为 证书配置策略 值为 OBS_NO_CERTIFICATE OBS_DEFAULT_CERTIFIC ATE 或 OBS_DEFINED_CERTIFIC ATE path char * 可选, 如果 ca_conf 为 OBS_DEFINED_CERT IFICATE 则为 path_length int 可选, 如果 path 不为 NULL 则为 证书路径 证书路径长度 文档版本 04 ( ) 版权所有 华为技术有限公司 12

18 示例代码 1. http 通信 ret_status = init_certificate_by_path(obs_protocol_http, OBS_NO_CERTIFICATE, NULL, 0); 2. https 通信, 使用默认证书, 即 lib 目录下的 client.pem ret_status = init_certificate_by_path(obs_protocol_https, OBS_DEFAULT_CERTIFICATE, NULL, 0); 3. https 通信, 应用程序指定证书路径及长度 ret_status = init_certificate_by_path(obs_protocol_https, OBS_DEFINED_CERTIFICATE, path, path_length); 3 初始化 2. 您也可以在 init_obs_options 之前调用 init_certificate_by_buffer 实现 https 通信 参数描述 字段名类型约束说明 buffer char * 证书内容 buffer_length int 证书内容长度 示例代码 ret_status = init_certificate_by_buffer(ca_buffer, length); 文档版本 04 ( ) 版权所有 华为技术有限公司 13

19 4 管理桶 4 管理桶 4.1 创建桶 您可以通过 create_bucket 创建桶 参数描述 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 canned_acl obs_canned_acl,4.5 管理桶访问权限 权限控制策略 location_constraint char * 可选桶的区域位置 handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 示例代码 以下代码展示如何新建一个桶 : static void test_create_bucket(obs_canned_acl canned_acl, char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; option.bucket_options.host_name = "<your-endpoint; // 设置响应回调函数 obs_response_handler response_handler = 文档版本 04 ( ) 版权所有 华为技术有限公司 14

20 4 管理桶 0, &response_complete_callback // 创建桶,< 预定义访问策略 > 值参考 5.5 管理桶访问权限 create_bucket(&option, "<bucket ACL>", NULL, &response_handler, &ret_status); if (ret_status == OBS_STATUS_OK) printf("create bucket successfully. \n"); printf("create bucket failed(%s).\n", obs_get_status_name(ret_status)); 说明 桶的名字是全局唯一的, 所以您需要确保不与已有的桶名称重复 桶命名规则如下 : 3~63 个字符, 数字或字母开头, 支持小写字母 数字 -. 禁止使用 IP 地址 禁止以 - 或. 开头及结尾 禁止两个. 相邻 ( 如 : my..bucket ) 禁止. 和 - 相邻 ( 如 : my-.bucket 和 my.-bucket ) 同一用户在同一个区域多次创建同名桶不会报错, 创建的桶属性以第一次请求为准 本示例创建的桶的访问权限默认是私有读写, 存储类型默认是标准类型, 区域位置为全局域名所在的默认区域 创建桶时, 如果使用的终端节点归属于默认区域华北 - 北京一 (cn-north-1), 则可以不指定区域 ; 否则, 如果使用的终端节点归属于其他区域, 则必须指定区域, 且指定的区域必须与终端节点归属的区域一致 当前有效的区域名称有 :cn-north-1 cn-east-2 cn-south-1 ap-southeast-1 您可以使用带参数创建方式, 在创建桶时, 指定桶的区域位置 带参数创建 创建桶时可以指定桶的访问权限 存储类型和区域位置 OBS 支持的桶的存储类型有三类, 参见桶存储类型 示例代码如下 : obs_status ret_status = OBS_STATUS_BUTT; // 设置响应回调函数 obs_response_handler response_handler = 0, &response_complete_callback // 设置桶的存储类型 option.bucket_options.storage_class = "<Your bucket storage policy>"; // 创建桶, 入参可设置桶预定义访问策略 桶区域位置 create_bucket(&option, "<bucket ACL>", "<Your bucket location>", &response_handler, &ret_status); 文档版本 04 ( ) 版权所有 华为技术有限公司 15

21 4 管理桶 if (ret_status == OBS_STATUS_OK) printf("create bucket successfully. \n"); printf("create bucket failed(%s).\n", obs_get_status_name(ret_status)); 4.2 列举桶 您可以通过 list_bucket_obs 列举桶 参数描述 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 handler obs_list_service_obs_ handler * 回调函数 callback_data void * 可选回调数据 示例代码 static void test_list_bucket_obs() option.bucket_options.certificate_info = "<Your certificate>"; list_service_data data; memset(&data, sizeof(list_service_data), 0, sizeof(list_service_data)); // 自定义响应回调函数 obs_list_service_handler listhandler = NULL, &list_bucket_complete_callback, &listserviceobscallback // 列举桶 list_bucket_obs(&option,&listhandler,&data); if (data.ret_status == OBS_STATUS_OK) printf("list bucket successfully. \n"); printf("list bucket failed(%s).\n", obs_get_status_name(data.ret_status)); 说明 获取到的桶列表将按照桶名字典顺序排列 文档版本 04 ( ) 版权所有 华为技术有限公司 16

22 4 管理桶 4.3 删除桶 您可以通过 delete_bucket 删除桶 参数描述 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 示例代码 static void test_delete_bucket(char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; // 设置响应回调函数 obs_response_handler response_handler = NULL, &response_complete_callback delete_bucket(&option, &response_handler, &ret_status); if (ret_status == OBS_STATUS_OK) printf("delete bucket successfully. \n"); printf("delete bucket failed(%s).\n", obs_get_status_name(ret_status)); 说明 如果桶不为空 ( 包含对象或分段上传碎片 ), 则该桶无法删除 删除桶非幂等操作, 删除不存在的桶会报错 4.4 判断桶是否存在 您可以通过 obs_head_bucket 接口判断该桶是否已存在 文档版本 04 ( ) 版权所有 华为技术有限公司 17

23 4 管理桶 参数描述 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 示例代码 static void test_head_bucket(char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; // 设置响应回调函数 obs_response_handler response_handler = 0, &response_complete_callback // 判断桶是否存在 obs_head_bucket(&option, &response_handler, &ret_status); if (ret_status == OBS_STATUS_OK) printf("head bucket successfully. \n"); printf("head bucket failed(%s).\n", obs_get_status_name(ret_status)); 4.5 管理桶访问权限 桶访问权限 (ACL) 可以通过三种方式设置 : 1. 创建桶时指定预定义访问策略 2. 调用 set_bucket_acl_by_head 指定预定义访问策略 3. 调用 set_bucket_acl 直接设置 OBS 支持的桶或对象权限包含五类, 见下表 : 文档版本 04 ( ) 版权所有 华为技术有限公司 18

24 4 管理桶 权限描述 OBS C SDK 对应值 读权限写权限读 ACP 权限写 ACP 权限完全控制权限 若有桶的读权限, 则可以获取该桶内对象列表和桶的元数据 若有对象的读权限, 则可以获取该对象内容和元数据 若有桶的写权限, 则可以上传 覆盖和删除该桶内任何对象 此权限在对象上不适用 若有读 ACP 的权限, 则可以获取对应的桶或对象的权限控制列表 (ACL) 桶或对象的所有者永远拥有读对应桶或对象 ACP 的权限 若有写 ACP 的权限, 则可以更新对应桶或对象的权限控制列表 (ACL) 桶或对象的所有者永远拥有写对应桶或对象的 ACP 的权限 拥有了写 ACP 的权限, 由于可以更改权限控制策略, 实际上意味着拥有了完全访问的权限 若有桶的完全控制权限意味着拥有 READ WRITE READ_ACP 和 WRITE_ACP 的权限 若有对象的完全控制权限意味着拥有 READ READ_ACP 和 WRITE_ACP 的权限 obs_permission. OBS_PERMISSION_REA D obs_permission. OBS_PERMISSION_WRIT E obs_permission. OBS_PERMISSION_REA D_ACP obs_permission. OBS_PERMISSION_WRIT E_ACP obs_permission. OBS_PERMISSION_FULL _CONTROL OBS 预定义的访问策略包含五类, 见下表 : 表 4-1 预定义访问策略 权限描述 OBS C SDK 对应值 私有读写 桶或对象的所有者拥有完全控制的权限, 其他任何人都没有访问权限 obs_canned_acl. OBS_CANNED_ACL_PRI VATE 文档版本 04 ( ) 版权所有 华为技术有限公司 19

25 4 管理桶 权限描述 OBS C SDK 对应值 公共读私有写 公共读写 桶公共读, 桶内对象公共读 桶公共读写, 桶内对象公共读写 设在桶上, 所有人可以获取该桶内对象列表 桶内多段任务 桶的元数据 桶的多版本 设在对象上, 所有人可以获取该对象内容和元数据 设在桶上, 所有人可以获取该桶内对象列表 桶内多段任务 桶的元数据 上传对象删除对象 初始化段任务 上传段 合并段 拷贝段 取消多段上传任务 设在对象上, 所有人可以获取该对象内容和元数据 设在桶上, 所有人可以获取该桶内对象列表 桶内多段任务 桶的元数据, 可以获取该桶内对象的内容和元数据 不能应用于对象 设在桶上, 所有人可以获取该桶内对象列表 桶内多段任务 桶的元数据 上传对象 删除对象 初始化段任务 上传段 合并段 拷贝段 取消多段上传任务, 可以获取该桶内对象的内容和元数据 不能应用于对象 obs_canned_acl. OBS_CANNED_ACL_PUB LIC_READ obs_canned_acl. OBS_CANNED_ACL_PUB LIC_READ_WRITE obs_canned_acl. OBS_CANNED_ACL_PUB LIC_READ_DELIVERED obs_canned_acl. OBS_CANNED_ACL_PUB LIC_READ_WRITE_DELI VERED 创桶时指定预定义访问策略 以下代码展示如何在创建桶时指定预定义访问策略 : static void test_create_bucket(obs_canned_acl canned_acl, char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; // 设置响应回调函数 文档版本 04 ( ) 版权所有 华为技术有限公司 20

26 4 管理桶 obs_response_handler response_handler = 0, &response_complete_callback // 创建桶 canned_acl 指定预定义访问策略 create_bucket(&option, canned_acl, NULL, &response_handler, &ret_status); if (ret_status == OBS_STATUS_OK) printf("create bucket successfully. \n"); printf("create bucket failed(%s).\n", obs_get_status_name(ret_status)); 为桶设置预定义访问策略 以下代码展示如何为桶设置预定义访问策略参数描述如下表 : 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 canned_acl obs_canned_acl 请参考 5.5- 管理桶访问权限, 表 1 预定义访问策略 handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 示例代码如下 : void test_set_bucket_acl_byhead(char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; // 设置响应回调函数 obs_response_handler response_handler = 0, &response_complete_callback // 设置桶预定义访问策略 obs_canned_acl canned_acl = OBS_CANNED_ACL_PUBLIC_READ_WRITE; set_bucket_acl_by_head(&option, canned_acl, &response_handler, &ret_status); if (ret_status == OBS_STATUS_OK) printf("set bucket acl by head successfully. \n"); printf("set bucket acl by head failed(%s).\n", obs_get_status_name(ret_status)); 文档版本 04 ( ) 版权所有 华为技术有限公司 21

27 4 管理桶 直接设置桶访问权限 以下代码展示如何直接设置桶访问权限参数描述如下表 : 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 aclinfo manager_acl_info * 管理 ACL 权限信息相关结构 体 aclinfo- >object_info obs_object_info * 忽略 对象名和版本号, 非多版本对 象,version 设置为 0 aclinfo->owner_id char * 忽略用户的 DomainId aclinfo- >acl_grant_count_r eturn int * 指向返回 aclinfo->acl_grants 的 个数的指针 aclinfo->acl_grants obs_acl_grant * 权限信息结构体指针, 请查看 下表, 表 2 权限信息结构体 obs_acl_grant 描述 aclinfo- >object_delivered obs_object_delivered 可选 对象 ACL 是否继承桶的 ACL, 有效值 OBJECT_DELIVERED_TRUE 和 OBJECT_DELIVERED_FALSE 默认 OBJECT_DELIVERED_TRUE handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 表 4-2 权限信息结构体 obs_acl_grant 描述 字段名类型说明 grantee_type obs_grantee_type 参看下表, 表 3 授权者类型描述 grantee.canonical_use r.id char CanonicalUser ID permission obs_permission 参看 5.5 管理桶访问权限 文档版本 04 ( ) 版权所有 华为技术有限公司 22

28 4 管理桶 字段名类型说明 bucket_delivered obs_bucket_delivered 桶的 ACL 是否向桶内对象传递, 有效值 BUCKET_DELIVERED_TRUE 和 BUCKET_DELIVERED_FALSE 默认 BUCKET_DELIVERED_FALSE 表 4-3 授权者类型描述 字段名 obs_grantee_type.obs_grant EE_TYPE_CANONICAL_USE R obs_grantee_type.obs_grant EE_TYPE_ALL_USERS 说明 OBS 用户, 桶或对象的权限可以授予任何拥有 OBS 账户的用户, 被授权后对应的 OBS 用户可以使用 AK 和 SK 访问 OBS 所有人, 所有人都可以访问对应的桶或对象, 包括匿名用户 示例代码如下 : void test_set_bucket_acl(char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; // 设置响应回调函数 obs_response_handler response_handler = 0, &response_complete_callback // 创建并初始化 acl 信息 manager_acl_info aclinfo; init_acl_info(&aclinfo); // 设置桶的访问权限 set_bucket_acl(&option, &aclinfo, &response_handler, &ret_status); if (OBS_STATUS_OK == ret_status) printf("set bucket acl successfully. \n"); printf("set bucket acl failed(%s).\n", obs_get_status_name(ret_status)); // 释放内存 deinitialize_acl_info(&aclinfo); 说明 ACL 中需要填写的所有者 (Owner) 或者被授权用户 (Grantee) 的 ID, 是指用户的账号 ID, 可通过 OBS 控制台 我的凭证 页面查看 文档版本 04 ( ) 版权所有 华为技术有限公司 23

29 4 管理桶 获取桶访问权限 您可以通过 get_bucket_acl 获取桶的访问权限 以下代码展示如何获取桶访问权限 : void test_get_bucket_acl(char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; // 设置响应回调函数 obs_response_handler response_handler = 0,&response_complete_callback // 申请 acl 结构内存 manager_acl_info *aclinfo = malloc_acl_info(); // 调用获取权限接口 get_bucket_acl(&option, aclinfo, &response_handler, &ret_status); if (OBS_STATUS_OK == ret_status) printf("get bucket acl: "); printf("%s\n", aclinfo->owner_id); if (aclinfo->acl_grant_count_return) print_grant_info(*aclinfo->acl_grant_count_return, aclinfo->acl_grants); printf("get bucket acl failed(%s).\n", obs_get_status_name(ret_status)); // 释放内存 free_acl_info(&aclinfo); 4.6 获取桶存量信息 参数描述 桶存量信息包括桶已使用的空间大小以及桶包含的对象个数 您可以通过 get_bucket_storage_info 获取桶的存量信息 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 capacity_length int 使用容量的缓存大小 capacity char * 使用容量 object_number_len gth int 对象数目的缓存大小 object_number char * 对象数目的缓存 文档版本 04 ( ) 版权所有 华为技术有限公司 24

30 4 管理桶 字段名类型约束说明 handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 示例代码 static void test_get_bucket_storage_info(char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; // 定义桶容量缓存及对象数缓存 char capacity[obs_common_len_256] = 0 char obj_num[obs_common_len_256] = 0 // 设置响应回调函数 obs_response_handler response_handler = NULL, &response_complete_callback // 获取桶存量信息 get_bucket_storage_info(&option, OBS_COMMON_LEN_256, capacity, OBS_COMMON_LEN_256, obj_num, &response_handler, &ret_status); if (ret_status == OBS_STATUS_OK) printf("get_bucket_storage_info success,bucket=%s objnum=%s capacity=%s\n", bucket_name, obj_num, capacity); printf("head bucket failed(%s).\n", obs_get_status_name(ret_status)); 4.7 桶配额 设置桶配额 您可以通过函数 set_bucket_quota 设置桶配额, 参数描述如下表 : 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 storage_quota uint64_t 配额大小, 单位字节 文档版本 04 ( ) 版权所有 华为技术有限公司 25

31 4 管理桶 字段名类型约束说明 handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 示例代码如下 : static void test_set_bucket_quota( char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; uint64_t bucketquota = ; // 设置响应回调函数 obs_response_handler response_handler = 0, &response_complete_callback // 设置桶配额 set_bucket_quota(&option, bucketquota, &response_handler, &ret_status); if (OBS_STATUS_OK == ret_status) printf("set bucket quota successfully. \n"); printf("set bucket quota failed(%s).\n", obs_get_status_name(ret_status)); 说明 桶配额值必须为非负整数, 单位为字节, 支持的最大值为 获取桶配额 您可以通过函数 get_bucket_quot 获取桶配额, 参数描述如下表 : 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 storagequota_retur n uint64_t * 获取到的配额大小, 单位字 节 handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 文档版本 04 ( ) 版权所有 华为技术有限公司 26

32 4 管理桶 示例代码如下 : static void test_get_bucket_quota( char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; // 设置响应回调函数 obs_response_handler response_handler = 0, &response_complete_callback // 获取桶配额 uint64_t bucketquota = 0; get_bucket_quota(&option, &bucketquota, &response_handler, &ret_status); if (OBS_STATUS_OK == ret_status) printf("bucket=%s Quota=%lu \n get bucket quota successfully. \n ", bucket_name, bucketquota); printf("get bucket quota failed(%s).\n", obs_get_status_name(ret_status)); 4.8 桶存储类型 OBS 允许您对桶配置不同的存储类型, 桶中对象的存储类型默认将与桶的存储类型保持一致 不同的存储类型可以满足客户业务对存储性能 成本的不同诉求 桶的存储类型分为三类, 见下表 : 类型说明 OBS C SDK 对应值 标准存储 低频访问存储 归档存储 标准存储拥有低访问时延和较高的吞吐量, 适用于有大量热点对象 ( 平均一个月多次 ) 或小对象 (<1MB), 且需要频繁访问数据的业务场景 低频访问存储适用于不频繁访问 ( 平均一年少于 12 次 ) 但在需要时也要求能够快速访问数据的业务场景 归档存储适用于很少访问 ( 平均一年访问一次 ) 数据的业务场景 OBS_STORAGE_CLAS S_STANDARD OBS_STORAGE_CLAS S_STANDARD_IA OBS_STORAGE_CLAS S_GLACIER 设置桶存储类型 更多关于桶存储类型的内容请参考桶的存储类别 您可以通过 set_bucket_storage_class_policy 设置桶存储类型, 参数描述如下表 : 文档版本 04 ( ) 版权所有 华为技术有限公司 27

33 4 管理桶 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 storage_class_polic y obs_storage_class 桶存储类型 handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 示例代码如下 : static void test_set_bucket_storage_class(char *bucket_name, obs_storage_class storage_class_policy) obs_status ret_status = OBS_STATUS_BUTT; // 设置响应回调函数 obs_response_handler response_handler = 0, &response_complete_callback set_bucket_storage_class_policy(&option, storage_class_policy, &response_handler, &ret_status); if (ret_status == OBS_STATUS_OK) printf("set bucket storage class successfully. \n"); printf("set bucket storage class failed(%s).\n", obs_get_status_name(ret_status)); 获取桶存储类型 您可以通过 get_bucket_storage_class_policy 获取桶存储类型, 参数描述如下表 : 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 handler obs_get_bucket_stora ge_class_handler * 回调函数 callback_data void * 可选回调数据 文档版本 04 ( ) 版权所有 华为技术有限公司 28

34 4 管理桶 示例代码如下 : static void test_get_bucket_storage_class(char *bucket_name) obs_status ret_status = OBS_STATUS_BUTT; // 设置响应回调函数 obs_get_bucket_storage_class_handler getbucketstorageresponse = 0, &response_complete_callback, &get_bucket_storageclass_handler // 获取桶存储类型 get_bucket_storage_class_policy(&option, &getbucketstorageresponse, &ret_status); if (OBS_STATUS_OK == ret_status) printf("get bucket storage class successfully.\n"); printf("get bucket storage class failed(%s).\n", obs_get_status_name(ret_status)); 文档版本 04 ( ) 版权所有 华为技术有限公司 29

35 5 上传对象 5 上传对象 5.1 流式上传 参数描述 流式上传需要将您的数据流传入回调数据 callback_data 中, 然后使用结构体 obs_put_object_handler 中定义的回调函数 put_object_data_callback 来处理传入的回调数据 通过调用 put_object 实现流式上传 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 key char * 对象名 content_length uint64_t 对象内容长度 put_properties obs_put_properties* 上传对象属性 encryption_params server_side_encryptio n_params * 可选 上传对象加密设置 handler obs_put_object_handl er * 回调函数 callback_data void * 可选回调数据 示例代码 static void test_put_object_from_buffer() // 待上传 buffer char *buffer = "abcdefg"; // 待上传 buffer 的长度 int buffer_size = strlen(buffer); // 上传的对象名 char *key = "put_buffer_test"; 文档版本 04 ( ) 版权所有 华为技术有限公司 30

36 5 上传对象 // 初始化 option option.bucket_options.certificate_info = "<Your certificate>"; // 初始化上传对象属性 obs_put_properties put_properties; init_put_properties(&put_properties); // 初始化存储上传数据的结构体 put_buffer_object_callback_data data; memset(&data, 0, sizeof(put_buffer_object_callback_data)); // 把 buffer 赋值到上传数据结构中 data.put_buffer = buffer; // 设置 buffersize data.buffer_size = buffer_size; // 设置回调函数 obs_put_object_handler putobjecthandler = &response_properties_callback, &put_buffer_complete_callback, &put_buffer_data_callback put_object(&option, key, buffer_size, &put_properties,0,&putobjecthandler,&data); if (OBS_STATUS_OK == data.ret_status) printf("put object from buffer successfully. \n"); printf("put object from buffer failed(%s).\n", obs_get_status_name(data.ret_status)); 说明 上传的内容大小不能超过 5GB put_object 接口中第五个参数是提供服务端加密功能的参数, 具体用法参考服务端加密章节 5.2 文件上传 文件上传使用本地文件作为对象的数据源, 参数同 5.1 流式上传 以下代码展示了如何进行文件上传 : static void test_put_object_from_file() // 上传对象名 char *key = "put_file_test"; // 上传的文件 char file_name[256] = "./put_file_test.txt"; uint64_t content_length = 0; // 初始化 option option.bucket_options.certificate_info = "<Your certificate>"; // 初始化上传对象属性 obs_put_properties put_properties; init_put_properties(&put_properties); 文档版本 04 ( ) 版权所有 华为技术有限公司 31

37 5 上传对象 // 初始化存储上传数据的结构体 put_file_object_callback_data data; memset(&data, 0, sizeof(put_file_object_callback_data)); // 打开文件, 并获取文件长度 content_length = open_file_and_get_length(file_name, &data); // 设置回调函数 obs_put_object_handler putobjecthandler = &response_properties_callback, &put_file_complete_callback, &put_file_data_callback put_object(&option, key, content_length, &put_properties, 0, &putobjecthandler, &data); if (OBS_STATUS_OK == data.ret_status) printf("put object from file successfully. \n"); printf("put object failed(%s).\n", obs_get_status_name(data.ret_status)); 说明 上传的内容大小不能超过 5GB 上传文件流时, 必须以二进制模式 ( rb 模式或者 rb+ 模式 ) 打开文件 5.3 创建文件夹 OBS 本身是没有文件夹的概念的, 桶中存储的元素只有对象 创建文件夹实际上是创建了一个大小为 0 且对象名以 / 结尾的对象, 这类对象与其他对象无任何差异, 可以进行下载 删除等操作, 只是 OBS 控制台会将这类以 / 结尾的对象以文件夹的方式展示 static void test_creat_folder() char *key = "YourFolder/"; // 初始化 option option.bucket_options.uri_style = OBS_URI_STYLE_PATH; temp_auth_configure tempauth; tempauthresult ptrresult; memset(&ptrresult,0,sizeof(tempauthresult)); // 初始化上传对象属性 obs_put_properties put_properties; init_put_properties(&put_properties); // 初始化存储上传数据的结构体 put_file_object_callback_data data; memset(&data, 0, sizeof(put_file_object_callback_data)); // 设置回调函数 obs_put_object_handler putobjecthandler = &response_properties_callback, &put_file_complete_callback, &put_file_data_callback put_object(&option, key, 0, &put_properties, 0, &putobjecthandler, &data); if (OBS_STATUS_OK == data.ret_status) printf("put object from file successfully. \n"); 文档版本 04 ( ) 版权所有 华为技术有限公司 32

38 5 上传对象 printf("put object failed(%s).\n", obs_get_status_name(data.ret_status)); 说明 创建文件夹本质上来说是创建了一个大小为 0 且对象名以 / 结尾的对象 多级文件夹创建最后一级即可, 比如 src1/src2/src3/, 创建 src1/src2/src3/ 即可, 无需创建 src1/ src1/src2/ 5.4 设置对象属性 您可以在上传对象时设置对象属性 对象属性包含对象长度 对象 MIME 类型 对象 MD5 值 ( 用于校验 ) 对象存储类型 对象自定义元数据 对象属性可以在多种上传方式下 ( 流式上传 文件上传 分段上传 基于表单上传 ), 或 7.5 复制对象时进行设置 对象属性参数在结构体 obs_put_properties 中 对象属性详细说明见下表 : 名称描述默认值 对象长度 (content_length) 对象 MIME 类型 (content_type) 对象 MD5 值 (md5) 对象存储类型 对象自定义元数据 上传对象的长度, 超过流 / 文件的长度会截断 对象的 MIME 类型, 定义对象的类型及网页编码, 决定浏览器将以什么形式 什么编码读取对象 对象数据的 MD5 值 ( 经过 Base64 编码 ), 提供给 OBS 服务端, 校验数据完整性 对象的存储类型, 不同的存储类型可以满足客户业务对存储性能 成本的不同诉求 默认与桶的存储类型保持一致, 可以设置为与桶的存储类型不同 用户对上传到桶中对象的自定义属性描述, 以便对对象进行自定义管理 流 / 文件实际长度无无无无 设置对象 MIME 类型 您可以通过在结构体 obs_put_properties 中对元素 content_type 赋值来设置对象 MIME 类型 以文件上传为例展示如何设置对象 MIME 类型 : static void test_put_object_from_file2() 文档版本 04 ( ) 版权所有 华为技术有限公司 33

39 5 上传对象 // 初始化结构体 put_properties, 可以通过该结构体设置对象属性 obs_put_properties put_properties; init_put_properties(&put_properties); // 设置 MIME 类型 put_properties.content_type = "text/html"; // 回调数据 put_file_object_callback_data data; memset(&data, 0, sizeof(put_file_object_callback_data)); // 将要上传的文件读到回调数据中 data.infile = 0; data.nostatus = 1; content_length = read_bytes_from_file("<uploaded filename>", &data); // 回调函数 obs_put_object_handler putobjecthandler = &response_properties_callback, &response_complete_callback, &put_buffer_object_data_callback // 上传数据流 put_object(&option,"<object key>", content_length, &put_properties, 0, &putobjecthandler, &data); if (OBS_STATUS_OK == data.ret_status) printf("put object from file successfully. \n"); printf("put object failed(%s).\n", obs_get_status_name(data.ret_status)); 说明 如果不设置对象 MIME 类型,SDK 会根据上传对象的后缀名自动判断对象 MIME 类型, 如.xml 判断为 application/xml 文件 ;.html 判断为 text/html 文件 设置对象存储类型 您可以通过 obs_bucket_context 中对元素 storage_class 赋值来设置对象存储类型 以下代码展示如何设置对象存储类型 : static void test_put_object_from_file3() // 设置存储类型为归档存储 option.bucket_options.storage_class = OBS_STORAGE_CLASS_GLACIER; // 初始化结构体 put_properties, 可以通过该结构体设置对象属性 obs_put_properties put_properties; init_put_properties(&put_properties); // 回调数据 put_file_object_callback_data data; memset(&data, 0, sizeof(put_file_object_callback_data)); // 将要上传的文件读到回调数据中 data.infile = 0; data.nostatus = 1; content_length = read_bytes_from_file("<uploaded filename>", &data); 文档版本 04 ( ) 版权所有 华为技术有限公司 34

40 5 上传对象 // 回调函数 obs_put_object_handler putobjecthandler = &response_properties_callback, &response_complete_callback, &put_buffer_object_data_callback // 上传数据流 put_object(&option,"<object key>", content_length, &put_properties, 0, &putobjecthandler, &data); if (OBS_STATUS_OK == data.ret_status) printf("put object from file successfully. \n"); printf("put object failed(%s).\n", obs_get_status_name(data.ret_status)); 说明 设置对象自定义元数据 如果不设置, 对象的存储类型默认与桶的存储类型保持一致 对象的存储类型分为三类, 其含义与 4.8 桶存储类型一致 下载归档存储类型的对象前必须将其取回 您可以通过 obs_put_properties 中对元素 meta_data 赋值来设置对象自定义元数据 以下代码展示如何设置对象自定义元数据 : static void test_put_object_from_file4() // 初始化结构体 put_properties, 可以通过该结构体设置对象属性 obs_put_properties put_properties; init_put_properties(&put_properties); // 设置自定义元数据 obs_name_value matadata; matadata.name ="property1"; matadata.value ="property-value1"; put_properties.meta_data = matadata; // 回调数据 put_file_object_callback_data data; memset(&data, 0, sizeof(put_file_object_callback_data)); // 将要上传的文件读到回调数据中 data.infile = 0; data.nostatus = 1; content_length = read_bytes_from_file("<uploaded filename>", &data); // 回调函数 obs_put_object_handler putobjecthandler = &response_properties_callback, &response_complete_callback, &put_buffer_object_data_callback // 上传数据流 put_object(&option,"<object key>", content_length, &put_properties, 0, &putobjecthandler, &data); if (OBS_STATUS_OK == data.ret_status) printf("put object from file successfully. \n"); 文档版本 04 ( ) 版权所有 华为技术有限公司 35

41 5 上传对象 说明 printf("put object failed(%s).\n", obs_get_status_name(data.ret_status)); 在上面设置对象自定义元数据示例代码中, 用户自定义了一个名称为 property1, 值为 property-value1 的元数据 一个对象可以有多个元数据, 总大小不能超过 8KB 对象的自定义元数据可以通过 get_object_metadata 获取, 参见 7.1 获取对象属性 使用 get_object 下载对象时, 对象的自定义元数据也会同时下载 5.5 分段上传 对于较大文件上传, 可以切分成段上传 用户可以在如下的应用场景内 ( 但不仅限于此 ), 使用分段上传的模式 : 上传超过 100MB 大小的文件 网络条件较差, 和 OBS 服务端之间的链接经常断开 上传前无法确定将要上传文件的大小 分段上传分为如下 3 个步骤 : 步骤 1 初始化分段上传任务 (initiate_multi_part_upload) 步骤 2 逐个或并行上传段 (upload_part) 步骤 3 合并段 (complete_multi_part_upload) 或取消分段上传任务 (abort_multi_part_upload) ---- 结束 初始化分段上传任务 使用分段上传方式传输数据前, 必须先通知 OBS 初始化一个分段上传任务 该操作会返回一个 OBS 服务端创建的全局唯一标识 (upload_id), 用于标识本次分段上传任务 您可以根据这个唯一标识来发起相关的操作, 如取消分段上传任务 列举分段上传任务 列举已上传的段等 您可以通过 initiate_multi_part_upload 初始化一个分段上传任务, 参数描述如下表所示 : 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 key char * 对象名 upload_id_return_s ize int 多段上传 id 缓存大小 upload_id_return char * 多段上传 id 缓存 put_properties obs_put_properties* 可选上传对象属性 文档版本 04 ( ) 版权所有 华为技术有限公司 36

42 5 上传对象 字段名类型约束说明 encryption_params server_side_encryptio n_params * 可选 服务端加密设置 handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 static void test_initiate_multi_part_upload() obs_status ret_status = OBS_STATUS_BUTT; // 定义多段上传 id 缓存及大小 char upload_id[obs_common_len_256] = 0 int upload_id_size = OBS_COMMON_LEN_256; // 设置响应回调函数 obs_response_handler handler = &response_properties_callback, &response_complete_callback // 初始化分段上传任务 initiate_multi_part_upload(&option, "<object key>", upload_id_size, upload_id, NULL, NULL, &handler, &ret_status); if (OBS_STATUS_OK == ret_status) printf("test init upload part successfully. uploadid= %s\n", upload_id); printf("test init upload part faied(%s).\n", obs_get_status_name(ret_status)); 说明 在结构体 obs_put_properties 中, 您可以设置对象 MIME 类型 对象自定义元数据 initiate_multi_part_upload 返回分段上传任务的全局唯一标识 (upload_id), 在后面的操作中将用到它 上传段 初始化一个分段上传任务之后, 可以根据指定的对象名和 uploadid 来分段上传数据 每一个上传的段都有一个标识它的号码 分段号 (Part Number, 范围是 1~10000) 对于同一个 uploadid, 该分段号不但唯一标识这一段数据, 也标识了这段数据在整个对象内的相对位置 如果您用同一个分段号上传了新的数据, 那么 OBS 上已有的这个段号的数据将被覆盖 除了最后一段以外, 其他段的大小范围是 100KB~5GB; 最后段大小范围是 0~5GB 每个段不需要按顺序上传, 甚至可以在不同进程 不同机器上上传, OBS 会按照分段号排序组成最终对象 您可以通过 upload_part 上传段, 参数描述如下表 : 文档版本 04 ( ) 版权所有 华为技术有限公司 37

43 5 上传对象 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 key char * 对象名 upload_part_info obs_upload_part_info * 上传段的信息 upload_part_info- >part_number upload_part_info- >upload_id unsigned int 上传段的段号 取值为从 1 到 的整数 char * 多段上传任务 Id content_length uint64_t 上传内容长度 put_properties obs_put_properties* 可选上传对象属性 encryption_params server_side_encryptio n_params * 可选 服务端加密设置 handler obs_upload_handler * 回调函数 callback_data void * 可选回调数据 示例代码如下 : static void test_upload_part() // 定义分片大小 5M uint64_t uploadslicesize =5L * 1024 * 1024; // 定义并初始化上传段大小 uint64_t uploadsize = uploadslicesize; // 定义并初始化上传文件长度变量 uint64_t filesize = 0; // 初始化 put_properties obs_put_properties put_properties; init_put_properties(&put_properties); // 回调函数 obs_upload_handler Handler = &response_properties_callback, &response_complete_callback, &testup_upload_file_data_callback // 回调数据初始化 test_upload_file_callback_data data; memset(&data, 0, sizeof(test_upload_file_callback_data)); filesize = get_file_info(filename,&data); data.nostatus = 1; data.part_size = uploadsize; data.part_num = (filesize % uploadsize == 0)? (filesize / uploadsize) : (filesize / uploadsize +1); 文档版本 04 ( ) 版权所有 华为技术有限公司 38

44 5 上传对象 // 上传第一段 uploadpartinfo.part_number="1"; uploadpartinfo.upload_id = "<upload id>"; data.start_byte = 0; upload_part(&option,key,&uploadpartinfo,uploadsize, &putproperties,0,&handler,&data); if (OBS_STATUS_OK == data.ret_status) printf("test upload part 1 successfully. \n"); printf("test upload part 1 faied(%s).\n", obs_get_status_name(data.ret_status)); // 上传第二段 uploadpartinfo.part_number="2"; uploadpartinfo.upload_id = "<upload id>"; filesize = get_file_info(filename,&data); uploadsize =filesize - uploadsize; data.part_size = uploadsize; data.start_byte = uploadslicesize; fseek(data.infile, data.start_byte, SEEK_SET); upload_part(&option,key,&uploadpartinfo,uploadsize, &putproperties,0,&handler,&data); if (OBS_STATUS_OK == data.ret_status) printf("test upload part 2 successfully. \n"); printf("test upload part 2 faied(%s).\n", obs_get_status_name(data.ret_status)); 说明 上传段接口要求除最后一段以外, 其他的段大小都要大于 100KB 但是上传段接口并不会立即校验上传段的大小 ( 因为不知道是否为最后一块 ); 只有调用合并段接口时才会校验 OBS 会将服务端收到段数据的 ETag 值 ( 段数据的 MD5 值 ) 返回给用户 为了保证数据在网络传输过程中不出现错误, 可以通过设置 MD5 值, 并放到 Content-MD5 请求头中 ;OBS 服务端会计算上传数据的 MD5 值与 SDK 计算的 MD5 值比较, 保证数据完整性 可以通过 put_properties.md5 直接设置上传数据的 MD5 值, 提供给 OBS 服务端用于校验数据完整性 分段号的范围是 1~10000 如果超出这个范围,OBS 将返回 400 Bad Request 错误 OBS 3.0 的桶支持最小段的大小为 100KB,OBS 2.0 的桶支持最小段的大小为 5MB 请在 OBS 3.0 的桶上执行分段上传操作 合并段 所有分段上传完成后, 需要调用合并段接口来在 OBS 服务端生成最终对象 在执行该操作时, 需要提供所有有效的分段列表 ( 包括分段号和分段 ETag 值 );OBS 收到提交的分段列表后, 会逐一验证每个段的有效性 当所有段验证通过后,OBS 将把这些分段组合成最终的对象 您可以通过 complete_multi_part_upload 合并段, 参数描述如下表 : 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 key char * 对象名 upload_id char * 指明多段上传任务 文档版本 04 ( ) 版权所有 华为技术有限公司 39

45 5 上传对象 字段名类型约束说明 part_number unsigned int 段个数,complete_upload_Info 数组长度 complete_upload_i nfo obs_complete_upload _Info * 段信息数组 complete_upload_i nfo->part_number complete_upload_i nfo->etag unsigned int 段号 char * 对应段的 ETag 值 put_properties obs_put_properties* 可选上传对象属性 handler obs_complete_multi_ part_upload_handler * 回调函数 callback_data void * 可选回调数据 示例代码如下 : static void test_complete_upload(char *filename, char *key) obs_status ret_status = OBS_STATUS_BUTT; // 初始化结构体 put_properties obs_put_properties put_properties; init_put_properties(&put_properties); // 设置分段信息 char *uploadid = "<upload id>"; obs_complete_upload_info info[2]; info[0].part_number="1"; info[0].etag="65fe0e161b35c8deead f7fa"; info[1].part_number="2"; info[1].etag="0433d5ffc28450be3b6cf25ab "; // 设置响应回调函数 obs_complete_multi_part_upload_handler Handler = &response_properties_callback, &response_complete_callback, &CompleteMultipartUploadCallback // 合并段 complete_multi_part_upload(&option,key,uploadid,number,info,&putproperties, &Handler, &ret_status); if (OBS_STATUS_OK == ret_status) printf("test complete upload successfully. \n"); printf("test complete upload faied(%s).\n", obs_get_status_name(ret_status)); 文档版本 04 ( ) 版权所有 华为技术有限公司 40

46 5 上传对象 说明 上面代码中的 info 结构体数组是进行上传段后保存的分段号和分段 ETag 值的列表 分段可以是不连续的 并发分段上传 分段上传的主要目的是解决大文件上传或网络条件较差的情况 下面的示例代码展示了如何使用分段上传并发上传大文件 : static void test_concurrent_upload_part(char *filename, char *key, uint64_t uploadslicesize) obs_status ret_status = OBS_STATUS_BUTT; char *concurrent_upload_id; uint64_t uploadsize = uploadslicesize; uint64_t filesize =0; // 初始化结构体 put_properties obs_put_properties put_properties; init_put_properties(&put_properties); // 大文件信息 : 文件指针, 文件大小, 按照分段大小的分段数 test_upload_file_callback_data data; memset(&data, 0, sizeof(test_upload_file_callback_data)); filesize = get_file_info(filename,&data); data.nostatus = 1; data.part_size = uploadsize; data.part_num = (filesize % uploadsize == 0)? (filesize / uploadsize) : (filesize / uploadsize +1); // 初始化上传段回调函数 obs_response_handler Handler = &response_properties_callback, &response_complete_callback // 合并段回调函数 obs_complete_multi_part_upload_handler complete_multi_handler = &response_properties_callback, &response_complete_callback, &CompleteMultipartUploadCallback // 初始化上传段任务返回 uploadid: uploadidreturn char uploadidreturn[256] = 0 int upload_id_return_size = 255; initiate_multi_part_upload(&option,key,upload_id_return_size,uploadidreturn, &putproperties, 0,&Handler, &ret_status); if (OBS_STATUS_OK == ret_status) printf("test init upload part return uploadidreturn(%s). \n", uploadidreturn); strcpy(concurrent_upload_id,uploadidreturn); printf("test init upload part faied(%s).\n", obs_get_status_name(ret_status)); // 并发上传 test_concurrent_upload_file_callback_data *concurrent_upload_file; concurrent_upload_file =(test_concurrent_upload_file_callback_data *)malloc( sizeof(test_concurrent_upload_file_callback_data)*(data.part_num+1)); if(concurrent_upload_file == NULL) printf("malloc test_concurrent_upload_file_callback_data failed!!!"); return ; 文档版本 04 ( ) 版权所有 华为技术有限公司 41

47 5 上传对象 test_concurrent_upload_file_callback_data *concurrent_upload_file_complete = concurrent_upload_file; start_upload_threads(data, concurrent_upload_id,filesize, key, option, concurrent_upload_file_complete); // 合并段 obs_complete_upload_info *upload_info = (obs_complete_upload_info *)malloc( sizeof(obs_complete_upload_info)*data.part_num); for(i=0; i<data.part_num; i++) upload_info[i].part_number = concurrent_upload_file_complete[i].part_num; upload_info[i].etag = concurrent_upload_file_complete[i].etag; complete_multi_part_upload(&option, key, uploadidreturn, data.part_num,upload_info,&putproperties,&complete_multi_handler,&ret_status); if (ret_status == OBS_STATUS_OK) printf("test complete upload successfully. \n"); printf("test complete upload faied(%s).\n", obs_get_status_name(ret_status)); if(concurrent_upload_file) free(concurrent_upload_file); concurrent_upload_file = NULL; if(upload_info) free(upload_info); upload_info = NULL; 5.6 分段复制 分段复制是分段上传的一种特殊情况, 即分段上传任务中的段通过复制 OBS 指定桶中现有对象 ( 或对象的一部分 ) 来实现 您可以通过 copy_part 来复制段, 参数描述如下表 : 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 key char * 对象名 object_info obs_copy_destination _object_info * 指明多段上传任务 object_info- >destination_bucke t object_info- >destination_key object_info- >last_modified_ret urn char * 目标对象所在桶 char * 目标对象名称 int64_t * 对象上次修改的时间 文档版本 04 ( ) 版权所有 华为技术有限公司 42

48 5 上传对象 字段名类型约束说明 object_info- >etag_return_size object_info- >etag_return int etag 缓存大小 char * etag 缓存 copypart obs_upload_part_info * 上传段信息 copypart- >part_number copypart- >upload_id unsigned int 上传段的段号 char * 多段上传任务 Id put_properties obs_put_properties* 可选上传对象属性 encryption_params server_side_encryptio n_params * 可选 服务端加密设置 handler obs_response_handler * 回调函数 callback_data void * 可选回调数据 示例代码如下 : static void test_copy_part() obs_status ret_status = OBS_STATUS_BUTT; // SSE-KMS 加密 server_side_encryption_params encryption_params; memset(&encryption_params, 0, sizeof(server_side_encryption_params)); // 复制段后返回的 etag 值 char etagreturn[256] =0 char *key= "<Source object key>" // 定义拷贝段信息 obs_copy_destination_object_info object_info; memset(&object_info, 0, sizeof(obs_copy_destination_object_info)); object_info.destination_bucket = "<Your destination bucketname>"; object_info.destination_key = "<Your destination object key>"; object_info.etag_return = etagreturn; object_info.etag_return_size = 256; obs_upload_part_info copypart; memset(&copypart, 0, sizeof(obs_upload_part_info)); // 设置响应回调函数 obs_response_handler responsehandler = &response_properties_callback, &response_complete_callback 文档版本 04 ( ) 版权所有 华为技术有限公司 43

49 5 上传对象 // 拷贝第一段 copypart.part_number = "1"; copypart.upload_id = "<upload id>"; copy_part(&option, key, &object_info, &copypart, &putproperties,&encryption_params,&responsehandler, &ret_status); if (OBS_STATUS_OK == ret_status) printf(" copy part 1 successfully. \n"); printf("copy part 1 failed(%s).\n", obs_get_status_name(ret_status)); // 拷贝第二段 copypart.part_number = "2"; copypart.upload_id = "<upload id>"; copy_part(&option, key, &object_info, &copypart, &putproperties,&encryption_params,&responsehandler, &ret_status); if (ret_status == OBS_STATUS_OK) printf(" copy part 2 successfully. \n"); printf("copy part 2 failed(%s).\n", obs_get_status_name(ret_status)); 5.7 断点续传上传 参数描述 当上传大文件时, 经常出现因网络不稳定或程序崩溃导致上传失败的情况 失败后再次重新上传不仅浪费资源, 而且当网络不稳定时仍然有上传失败的风险 断点续传上传接口能有效地解决此类问题引起的上传失败, 其原理是将待上传的文件分成若干个分段分别上传, 并实时地将每段上传结果统一记录在 checkpoint 文件中, 仅当所有分段都上传成功时返回上传成功的结果, 否则抛出异常提醒用户再次调用接口进行重新上传 ( 重新上传时因为有 checkpoint 文件记录当前的上传进度, 避免重新上传所有分段, 从而节省资源提高效率 ) 您可以通过 upload_file 进行断点续传上传 该接口可设置的参数如下 : 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 key char * 对象名 upload_file_config obs_upload_file_con figuration * 上传文件的配置说明, 请参看下表 encryption_params server_side_encrypti on_params * 可选 上传对象加密设置 handler obs_upload_file_res ponse_handler * 回调函数 callback_data void * 可选回调数据 上传文件结构 obs_upload_file_configuration 描述如下表 : 文档版本 04 ( ) 版权所有 华为技术有限公司 44

50 5 上传对象 成员名类型约束说明 upload_file char * 待上传的本地文件 part_size uint64_t 分段大小, 单位字节, 取值范 围是 5MB~5GB, 默认为 5MB check_point_file char * 记录上传进度的文件, 只在断点续传模式下有效 当该值为空时, 默认与待上传的本地文件同目录 enable_check_poin t int 是否开启断点续传模式, 默认 为 0, 表示不开启 task_num int 分段上传时的最大并发数, 默 认为 1 示例代码 以下代码展示了如何使用断点续传上传接口上传文件 : static void test_upload_file() obs_status ret_status = OBS_STATUS_BUTT; // 初始化结构体 put_properties obs_put_properties put_properties; init_put_properties(&put_properties); obs_upload_file_configuration uploadfileinfo; memset_s(&uploadfileinfo,sizeof(obs_upload_file_configuration), 0,sizeof(obs_upload_file_configuration)); uploadfileinfo.check_point_file = 0; uploadfileinfo.enable_check_point = 1; uploadfileinfo.part_size = "<part size>"; uploadfileinfo.task_num = "<task num>"; uploadfileinfo.upload_file = "<upload filename>"; // 回调函数 obs_upload_file_response_handler Handler = &response_properties_callback, &response_complete_callback, &uploadfileresultcallback initialize_break_point_lock();upload_file(&option, "<Your Key>", 0, &uploadfileinfo, &Handler, &ret_status); deinitialize_break_point_lock(); if (OBS_STATUS_OK == ret_status) printf("test upload file successfully. \n"); printf("test upload file faied(%s).\n", obs_get_status_name(ret_status)); 文档版本 04 ( ) 版权所有 华为技术有限公司 45

51 5 上传对象 说明 断点续传上传接口是利用 5.5 分段上传特性实现的, 是对分段上传的封装和加强 断点续传上传接口不仅能在失败重传时节省资源提高效率, 还因其对分段进行并发上传的机制能加快上传速度, 帮助用户快速完成上传业务 ; 且其对用户透明, 用户不用关心 checkpoint 文件的创建和删除 分段任务的切分 并发上传的实现等内部细节 enable_check_point 参数 :0 代表不启用断点续传模式, 此时断点续传上传接口退化成对分段上传的简单封装, 不会产生 checkpoint 文件,1 代表启用断点续传模式 5.8 追加写 追加写接口 append_object 同 put_object 参数和使用方法一样, 只不过是多了一个写对象的起始位置 position 参数描述 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 key char * 对象名 content_length uint64_t 对象内容长度 position char * 追加写的起始位置 put_properties obs_put_properties* 上传对象属性 encryption_params server_side_encryptio n_params * 可选 上传对象加密设置 handler obs_append_object_h andler * 回调函数 callback_data void * 可选回调数据 示例代码 static void test_append_object_from_buffer() // 待上传 buffer char *buffer = "abcdefg"; // 待上传 buffer 的长度 int buffer_size = strlen(buffer); // 上传的对象名 char *key = "put_buffer_test"; char * position = "0"; // 初始化 option option.bucket_options.certificate_info = "<Your certificate>"; // 初始化上传对象属性 obs_put_properties put_properties; 文档版本 04 ( ) 版权所有 华为技术有限公司 46

52 5 上传对象 init_put_properties(&put_properties); // 初始化存储上传数据的结构体 put_buffer_object_callback_data data; memset(&data, 0, sizeof(put_buffer_object_callback_data)); // 把 buffer 赋值到上传数据结构中 data.put_buffer = buffer; // 设置 buffersize data.buffer_size = buffer_size; // 设置回调函数 obs_put_object_handler putobjecthandler = &response_properties_callback, &put_buffer_complete_callback, &put_buffer_data_callback append_object(&option, key, buffer_size, position, &put_properties, 0,&putobjectHandler,&data); if (OBS_STATUS_OK == data.ret_status) printf("put object from buffer successfully. \n"); printf("put object from buffer failed(%s).\n", obs_get_status_name(data.ret_status)); 说明 put_object 上传的对象可覆盖 append_object 上传的对象, 覆盖后对象变为普通对象, 不可再进行追加上传 第一次调用追加上传时, 若已存在同名的普通对象, 则会报错 (HTTP 状态码为 409) 每次追加上传返回的 ETag 是当次追加数据内容的 ETag, 不是完整对象的 ETag; 单次追加上传的内容不能超过 5GB, 且最多支持 次追加上传 append_object 接口中第六个参数是提供服务端加密功能的参数, 具体用法参考服务端加密章节 文档版本 04 ( ) 版权所有 华为技术有限公司 47

53 6 下载对象 6 下载对象 6.1 对象下载 参数描述 您可以调用 get_object 函数下载对象 字段名类型约束说明 option 请求桶的上下文, 3.3 配置 option 桶参数 object_info obs_object_info * 对象名和版本号, 非多版本对 象,version 设置为 0 get_conditions obs_get_conditions * 对象筛选条件和读取范围设 置 encryption_params server_side_encryptio n_params * 可选 获取对象的解密设置 handler obs_get_object_handl er * 回调函数 callback_data void * 可选回调数据 示例代码 static void test_get_object() char *file_name = "./test"; obs_object_info object_info; // 初始化 option 文档版本 04 ( ) 版权所有 华为技术有限公司 48

javascript sdk javascript sdk 列出 Bucket 内的对象上传 textarea 内容到 Bucket 上传本地文件生成私有下载链接生成带过期时间的私有链接删除对象下载对象拷贝对象查看文件访问权限设置文件访问权限获取静态网站配置设置静态网站删除静态网站查询对象元数据查询

javascript sdk javascript sdk 列出 Bucket 内的对象上传 textarea 内容到 Bucket 上传本地文件生成私有下载链接生成带过期时间的私有链接删除对象下载对象拷贝对象查看文件访问权限设置文件访问权限获取静态网站配置设置静态网站删除静态网站查询对象元数据查询 javascript sdk javascript sdk 列出 Bucket 内的对象上传 textarea 内容到 Bucket 上传本地文件生成私有下载链接生成带过期时间的私有链接删除对象下载对象拷贝对象查看文件访问权限设置文件访问权限获取静态网站配置设置静态网站删除静态网站查询对象元数据查询桶的多版本 Bucket 开启对象多版本支持挂起 Bucket 的多版本对象功能浏览器客户端浏览器客户端的

More information

phar 方式 使用 phar 单文件方式, 在 https://github.com/aws/aws sdk php/releases?after= 页面中, 选择 版本 , 下载已经打包好的 phar 文件, 然后在你的代码中引入这个文件即可 : require_once

phar 方式 使用 phar 单文件方式, 在 https://github.com/aws/aws sdk php/releases?after= 页面中, 选择 版本 , 下载已经打包好的 phar 文件, 然后在你的代码中引入这个文件即可 : require_once S3 PHP SDK 使用文档 S3 PHP SDK 说明 对象存储 S3 PHP SDK 使用开源的 S3 PHP SDK aws/aws sdk php 本文档介绍用户如何使用 aws/aws sdk php 来使用对象存储服务 更加详细的接口参数说明, 请在使用时参照 aws/aws sdkphp API 官方说明 http://docs.aws.amazon.com/aws sdk php/v3/api/api

More information

完成后, 目录结构应该像下面这样 :. app.php composer.json composer.phar composer.lock vendor 其中 app.php 是用户的应用程序,vendor/ 目录下包含了所依赖的库, 用户需要在 app.php 中 引入依赖 : require_o

完成后, 目录结构应该像下面这样 :. app.php composer.json composer.phar composer.lock vendor 其中 app.php 是用户的应用程序,vendor/ 目录下包含了所依赖的库, 用户需要在 app.php 中 引入依赖 : require_o S3 PHP SDK 使用文档 S3 PHP SDK 说明 对象存储 S3 PHP SDK 使用开源的 S3 PHP SDK aws/aws sdk php 本文档介绍用户如何使用 aws/aws sdk php 来使用对象存储服务 更加详细的接口参数说明, 请在使用时参照 aws/aws sdk php API 官方说明 http://docs.aws.amazon.com/aws sdk php/v3/api/api

More information

S3.Net SDK 文档 1 SDK 说明 对象存储.Net SDK 使用开源的 S3.Net SDK 本文档介绍用户如何使用 S3.Net SDK 来 使用对象存储服务 更加详细的接口参数说明, 请在使用时参照 S3.Net SDK 官方说 明

S3.Net SDK 文档 1 SDK 说明 对象存储.Net SDK 使用开源的 S3.Net SDK 本文档介绍用户如何使用 S3.Net SDK 来 使用对象存储服务 更加详细的接口参数说明, 请在使用时参照 S3.Net SDK 官方说 明 S3.Net SDK 文档 1 SDK 说明 对象存储.Net SDK 使用开源的 S3.Net SDK 本文档介绍用户如何使用 S3.Net SDK 来 使用对象存储服务 更加详细的接口参数说明, 请在使用时参照 S3.Net SDK 官方说 明 https://aws.amazon.com/cn/sdk-for-net/ 2 安装 SDK 2.1 依赖环境 windows 平台 : 安装.Net

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

SDK 说明 Onest python SDK 来源于开源的 boto3 用户在使用 Onest 云存储服务时, 可以选择直接使用 aws 原生的 sdk, 本文档只是提供了一些常用接口的简单实示例, 如需更加详细的接口参数说明, 请在使用时参照 boto3 API 官方说明 boto3 安装 py

SDK 说明 Onest python SDK 来源于开源的 boto3 用户在使用 Onest 云存储服务时, 可以选择直接使用 aws 原生的 sdk, 本文档只是提供了一些常用接口的简单实示例, 如需更加详细的接口参数说明, 请在使用时参照 boto3 API 官方说明 boto3 安装 py Python SDK 使用文档 Python SDK 使用文档接口域名 SDK 说明安装 python SDK Client 初始化 API 接口说明 1. listbuckets 2. getbucketlocation 3. createbucket 4. headbucket 5. deletebucket 6. getbucketacl 7. putbucketacl 8. listobjects

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

SDK参考

SDK参考 文档版本 03 发布日期 2019-01-30 华为技术有限公司 版权所有 华为技术有限公司 2019 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束, 本文档中描述的全部或部分产品

More information

注意 : 请不要用生产 Bucket 试验本文档中的例子 查看 Bucket 列表 from boto3.session import Session import boto3 #Client 初始化 access_key = " 您的 AccessKey" secret_key = " 您的 Se

注意 : 请不要用生产 Bucket 试验本文档中的例子 查看 Bucket 列表 from boto3.session import Session import boto3 #Client 初始化 access_key =  您的 AccessKey secret_key =  您的 Se S3 Python SDK 文档 SDK 说明 对象存储 Python SDK 使用开源的 S3 Python SDK boto3 本文档介绍用户如何使用 boto3 来使用对象存储服务 更加详细的接口参数说明, 请在使用时参照 boto3 API 官方说 明 boto3 环境依赖 此版本的 Python SDK 适用于 Python 2.7 安装 Python S3 SDK 通过 pip 安装,

More information

产品介绍

产品介绍 对象存储服务 产品介绍 文档版本 16 发布日期 2018-11-30 华为技术有限公司 版权所有 华为技术有限公司 2018 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束,

More information

API参考

API参考 文档版本 03 发布日期 2018-06-20 华为技术有限公司 版权所有 华为技术有限公司 2018 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束, 本文档中描述的全部或部分产品

More information

开发指南

开发指南 对象存储服务 开发指南 文档版本 05 发布日期 2018-12-14 华为技术有限公司 版权所有 华为技术有限公司 2018 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束,

More information

新美大酒店开放平台SDK(.NET版)使用说明.pages

新美大酒店开放平台SDK(.NET版)使用说明.pages SDK(.NET 版 ) 使 用说明 1 SDK 包说明 1.1 获取 SDK SDK 可以在数据平台下载, 也可直接通过下载地址获得 下载地址 : http://s3.meituan.net/v1/mss_de81c933e113413ea913a772b707b9c9/open-platform-sdk/mthotelopenplatform-sdk-1.0-net.zip 下载成功后, 解压后可获得

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

SDK参考

SDK参考 文档版本 05 发布日期 2019-06-25 华为技术有限公司 版权所有 华为技术有限公司 2019 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束, 本文档中描述的全部或部分产品

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

友普云对象存储操作手册 友普云对象存储操作手册 1 登录友普云管理平台 对象存储服务订购 对象存储使用方法 使用 Cyberduck 客户端管理对象存储 客户端下载 新建连接 新建容器..

友普云对象存储操作手册 友普云对象存储操作手册 1 登录友普云管理平台 对象存储服务订购 对象存储使用方法 使用 Cyberduck 客户端管理对象存储 客户端下载 新建连接 新建容器.. 1 登录友普云管理平台... 2 2 对象存储服务订购... 2 3 对象存储使用方法... 3 3.1 使用 Cyberduck 客户端管理对象存储... 4 3.1.1 客户端下载... 4 3.1.2 新建连接... 4 3.1.3 新建容器... 6 3.1.4 上传文件 ( 对象 )... 7 3.1.5 下载容器或对象... 9 3.1.6 删除文件 ( 对象 )... 10 3.1.7

More information

客户端指南(OBS Browser)

客户端指南(OBS Browser) 对象存储服务 客户端指南 (OBS Browser) 文档版本 11 发布日期 2018-07-30 华为技术有限公司 版权所有 华为技术有限公司 2018 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品

More information

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 access_token=access_token (http

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址   access_token=access_token (http 停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 https://webapi.zego.im/cgi/stop-mix? access_token=access_token (https://webapi.zego.im/cgi/stop-mix? access_token=access_token)

More information

云数据库 RDS SDK

云数据库 RDS SDK 云数据库 RDS SDK SDK SDK 下载 SDK 下载 最新版本 java_sdk.zip python_sdk.zip php_sdk.zip c#_sdk.zip 历史版本 2015-11-3 java_sdk.zip python_sdk.zip php_sdk.zip c#_sdk.zip JAVA 教程 JAVA 创建 Access Key 登陆阿里云账号 打开 我的 Access

More information

目 录(目录名)

目  录(目录名) 目录 目录...1-1 1.1 域名解析配置命令... 1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-1 1.1.3 display dns server... 1-2 1.1.4 display ip host... 1-3 1.1.5 dns domain... 1-4 1.1.6 dns resolve...

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

工具指南

工具指南 对象存储服务 工具指南 文档版本 01 发布日期 2018-12-11 华为技术有限公司 版权所有 华为技术有限公司 2018 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束,

More information

SDK参考

SDK参考 文档版本 03 发布日期 2018-07-30 华为技术有限公司 版权所有 华为技术有限公司 2018 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束, 本文档中描述的全部或部分产品

More information

ChinaBI企业会员服务- BI企业

ChinaBI企业会员服务- BI企业 商业智能 (BI) 开源工具 Pentaho BisDemo 介绍及操作说明 联系人 : 杜号权苏州百咨信息技术有限公司电话 : 0512-62861389 手机 :18616571230 QQ:37971343 E-mail:du.haoquan@bizintelsolutions.com 权限控制管理 : 权限控制管理包括 : 浏览权限和数据权限 ( 权限部分两个角色 :ceo,usa; 两个用户

More information

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt 2004 Marty Hall 服务器响应的生成 : HTTP 状态代码 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

常见问题

常见问题 数据管理服务 常见问题 文档版本 03 发布日期 2018-12-21 华为技术有限公司 版权所有 华为技术有限公司 2019 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束,

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

}; "P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ", " " string imagedata; if(0!= read_image("a.jpg",imagedata)) { return -1; } string rsp; ytopen_sdk m_sd

}; P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ,   string imagedata; if(0!= read_image(a.jpg,imagedata)) { return -1; } string rsp; ytopen_sdk m_sd tencentyun-youtu c++ sdk for 腾讯云智能优图服务 & 腾讯优图开放平台 安装 运行环境 Linux 依赖项 - curl-7.40.0, 获取更新版本 https://github.com/bagder/curl - openssl-1.0.1k, 获取更新版本 https://github.com/openssl/openssl 构建工程 工程采用 CMake 构建 1.

More information

SDK 手册 Java-SDK 前言 SDK 下载 - Java SDK 开发包最新版本 2.2.3:java_sdk_ zip; - github 地址 : 版本迭代详情参考这里 简介 - O

SDK 手册 Java-SDK 前言 SDK 下载 - Java SDK 开发包最新版本 2.2.3:java_sdk_ zip; - github 地址 :  版本迭代详情参考这里 简介 - O 对象存储 OSS SDK 手册 SDK 手册 Java-SDK 前言 SDK 下载 - Java SDK 开发包最新版本 2.2.3:java_sdk_20160510.zip; - github 地址 :https://github.com/aliyun/aliyun-oss-java-sdk 版本迭代详情参考这里 简介 - OSS Java SDK 适用于 JDK 6 及以上版本 ; - 本文档主要介绍

More information

Chapter #

Chapter # 第三章 TCP/IP 协议栈 本章目标 通过本章的学习, 您应该掌握以下内容 : 掌握 TCP/IP 分层模型 掌握 IP 协议原理 理解 OSI 和 TCP/IP 模型的区别和联系 TCP/IP 介绍 主机 主机 Internet TCP/IP 早期的协议族 全球范围 TCP/IP 协议栈 7 6 5 4 3 应用层表示层会话层传输层网络层 应用层 主机到主机层 Internet 层 2 1 数据链路层

More information

客户端指南(obscmd)

客户端指南(obscmd) 对象存储服务 客户端指南 (obscmd) 文档版本 04 发布日期 2018-09-03 华为技术有限公司 版权所有 华为技术有限公司 2018 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束,

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

業 用 地 出 讓 最 低 價 標 準 不 得 低 於 土 地 取 得 成 本 土 地 前 期 開 發 成 本 和 按 規 定 收 取 的 相 關 費 用 之 和 工 業 用 地 必 須 採 用 招 標 拍 賣 掛 牌 方 式 出 讓 其 出 讓 價 格 不 得 低 於 公 佈 的 最 低 價 標

業 用 地 出 讓 最 低 價 標 準 不 得 低 於 土 地 取 得 成 本 土 地 前 期 開 發 成 本 和 按 規 定 收 取 的 相 關 費 用 之 和 工 業 用 地 必 須 採 用 招 標 拍 賣 掛 牌 方 式 出 讓 其 出 讓 價 格 不 得 低 於 公 佈 的 最 低 價 標 我 們 為 一 間 所 有 運 營 均 在 中 國 進 行 的 甲 級 物 流 設 施 供 應 商 以 下 為 對 我 們 在 中 國 的 業 務營運有重大關係的中國法律及法規概要 項目的開發 開發用地 儘 管 中 國 的 所 有 土 地 均 歸 國 家 或 集 體 所 有 然 而 個 人 及 企 業 可 獲 得 土 地 使 用 權 及 持 有 有關土地使用權作開發用途 全 國 人 民 代 表 大

More information

条款

条款 中 银 保 险 有 限 公 司 国 内 贸 易 信 用 保 险 (C 款 ) 条 款 1. 承 保 范 围 1.01 被 保 险 人 所 获 得 的 保 障 我 们 是 特 别 条 款 中 所 称 的 保 险 人 我 们 向 您, 即 特 别 条 款 中 所 称 的 被 保 险 人, 签 发 本 保 单, 并 就 本 保 单 收 取 保 险 费 根 据 保 单 的 条 款 和 条 件, 如 果 由

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

院系▲

院系▲ 张 家 界 航 空 工 业 职 业 技 术 学 院 毕 业 生 就 业 质 量 年 度 报 告 (2015 届 ) 二 〇 一 五 年 十 二 月 1 目 录 第 一 章 毕 业 生 就 业 基 本 情 况 1.1 毕 业 生 规 模 和 结 构 1 1.2 毕 业 生 就 业 率 4 1.3 毕 业 就 业 情 况 7 1.4 自 主 创 业 情 况 16 第 二 章 毕 业 生 就 业 相 关

More information

地域相关接口API文档

地域相关接口API文档 云服务器 地域相关接口 API 文档 版权声明 2015-2016 腾讯云版权所有 本文档著作权归腾讯云单独所有, 未经腾讯云事先书面许可, 任何主体不得以任何形式复制 修改 抄袭 传 播全部或部分本文档内容 商标声明 及其它腾讯云服务相关的商标均为腾讯云计算 ( 北京 ) 有限责任公司及其关联公司所有 本文档涉及的第三方 主体的商标, 依法由权利人所有 服务声明 本文档意在向客户介绍腾讯云全部或部分产品

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

第一章简介 RippleTek 微信认证服务 API 为开发者提供 HTTP 接口, 即开发者可通过发起包含 JSON 数据的 HTTP POST 请求, 向 RippleTek 微信认证服务器申请特定操作 ( 认证 URL 上网验证码 取消认证和查询用户 OPENID) 开发者可以使用此套 API

第一章简介 RippleTek 微信认证服务 API 为开发者提供 HTTP 接口, 即开发者可通过发起包含 JSON 数据的 HTTP POST 请求, 向 RippleTek 微信认证服务器申请特定操作 ( 认证 URL 上网验证码 取消认证和查询用户 OPENID) 开发者可以使用此套 API 微信认证接口文档 v1.1 第一章简介 RippleTek 微信认证服务 API 为开发者提供 HTTP 接口, 即开发者可通过发起包含 JSON 数据的 HTTP POST 请求, 向 RippleTek 微信认证服务器申请特定操作 ( 认证 URL 上网验证码 取消认证和查询用户 OPENID) 开发者可以使用此套 API 定制开发基于 RippleTek 热点解决方案的微信认证管理 第二章获取认证链接

More information

快速入门

快速入门 弹性文件服务 快速入门 文档版本 01 发布日期 2018-05-25 华为技术有限公司 版权所有 华为技术有限公司 2018 保留一切权利 非经本公司书面许可, 任何单位和个人不得擅自摘抄 复制本文档内容的部分或全部, 并不得以任何形式传播 商标声明 和其他华为商标均为华为技术有限公司的商标 本文档提及的其他所有商标或注册商标, 由各自的所有人拥有 注意 您购买的产品 服务或特性等应受华为公司商业合同和条款的约束,

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

2015 2002 2 11 2002 2 11 346 2005 1 1 2015 4 10 2015 3 10 2015 4 10 2005 1 1 2015 4 10 2015 4 10 86 2000 7 25 2000 9 1 100,000 87 2012 6 18 50% 1995 3 18 2015 12 27 2016 6 1 2003 9 1 2013 6 29 2004 4 1

More information

A API Application Programming Interface 见 应 用 程 序 编 程 接 口 ARP Address Resolution Protocol 地 址 解 析 协 议 为 IP 地 址 到 对 应 的 硬 件 地 址 之 间 提 供 动 态 映 射 阿 里 云 内

A API Application Programming Interface 见 应 用 程 序 编 程 接 口 ARP Address Resolution Protocol 地 址 解 析 协 议 为 IP 地 址 到 对 应 的 硬 件 地 址 之 间 提 供 动 态 映 射 阿 里 云 内 A API Application Programming Interface 见 应 用 程 序 编 程 接 口 ARP Address Resolution Protocol 地 址 解 析 协 议 为 IP 地 址 到 对 应 的 硬 件 地 址 之 间 提 供 动 态 映 射 阿 里 云 内 容 分 发 网 络 Alibaba Cloud Content Delivery Network 一

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

untitled

untitled 1993 79 2010 9 80 180,000 (a) (b) 81 20031,230 2009 10,610 43 2003 2009 1,200 1,000 924 1,061 800 717 600 530 440 400 333 200 123 0 2003 2004 2005 2006 2007 2008 2009 500 2003 15,238 2009 31,4532003 2009

More information

南華大學數位論文

南華大學數位論文 南 華 大 學 哲 學 與 生 命 教 育 學 系 碩 士 論 文 呂 氏 春 秋 音 樂 思 想 研 究 研 究 生 : 何 貞 宜 指 導 教 授 : 陳 章 錫 博 士 中 華 民 國 一 百 零 一 年 六 月 六 日 誌 謝 論 文 得 以 完 成, 最 重 要 的, 是 要 感 謝 我 的 指 導 教 授 陳 章 錫 博 士, 老 師 總 是 不 辭 辛 勞 仔 細 閱 讀 我 的 拙

More information

Microsoft Word - 3.3.1 - 一年級散文教案.doc

Microsoft Word - 3.3.1 - 一年級散文教案.doc 光 明 英 來 學 校 ( 中 國 文 學 之 旅 --- 散 文 小 說 教 學 ) 一 年 級 : 成 語 ( 主 題 : 勤 學 ) 節 數 : 六 教 節 ( 每 課 題 一 教 節 ) 課 題 : 守 株 待 兔 半 途 而 廢 愚 公 移 山 鐵 杵 磨 針 孟 母 三 遷 教 學 目 的 : 1. 透 過 活 動, 學 生 能 說 出 成 語 背 後 的 含 意 2. 學 生 能 指

More information

第32回独立行政法人評価委員会日本貿易保険部会 資料1-1 平成22年度財務諸表等

第32回独立行政法人評価委員会日本貿易保険部会 資料1-1 平成22年度財務諸表等 1 12,403 2,892 264,553 19,517 238,008 10,132 989 36 9,869 2,218 250 122 ( 126 108 1,563 278 159 260 478 35,563 1,073 74 190,283 104,352 140,658 20,349 16,733 21,607 (21,607) 58,689 303,699 339,262 339,262

More information

Microsoft Word - 08 单元一儿童文学理论

Microsoft Word - 08 单元一儿童文学理论 单 元 ( 一 ) 儿 童 文 学 理 论 内 容 提 要 : 本 单 元 共 分 成 三 个 小 课 目, 即 儿 童 文 学 的 基 本 理 论 儿 童 文 学 创 作 和 儿 童 文 学 的 鉴 赏 与 阅 读 指 导 儿 童 文 学 的 基 本 理 论 内 容 包 括 儿 童 文 学 的 基 本 含 义 儿 童 文 学 读 者 儿 童 文 学 与 儿 童 年 龄 特 征 和 儿 童 文 学

More information

項 訴 求 在 考 慮 到 整 體 的 財 政 承 擔 以 及 資 源 分 配 的 公 平 性 下, 政 府 採 取 了 較 簡 單 直 接 的 一 次 性 減 稅 和 增 加 免 稅 額 方 式, 以 回 應 中 產 家 庭 的 不 同 訴 求 ( 三 ) 取 消 外 傭 徵 費 6. 行 政 長

項 訴 求 在 考 慮 到 整 體 的 財 政 承 擔 以 及 資 源 分 配 的 公 平 性 下, 政 府 採 取 了 較 簡 單 直 接 的 一 次 性 減 稅 和 增 加 免 稅 額 方 式, 以 回 應 中 產 家 庭 的 不 同 訴 求 ( 三 ) 取 消 外 傭 徵 費 6. 行 政 長 2013 年 1 月 23 日 的 立 法 會 會 議 葛 珮 帆 議 員 就 幫 助 中 產 動 議 的 議 案 ( 經 單 仲 偕 議 員 及 莫 乃 光 議 員 修 正 ) 進 度 報 告 在 2013 年 1 月 23 日 的 立 法 會 會 議 上, 由 葛 珮 帆 議 員 就 幫 助 中 產 動 議 的 議 案, 經 單 仲 偕 議 員 及 莫 乃 光 議 員 修 正 後 獲 得 通 過

More information

(f) (g) (h) (ii) (iii) (a) (b) (c) (d) 208

(f) (g) (h) (ii) (iii) (a) (b) (c) (d) 208 (a) (b) (c) (d) (e) 207 (f) (g) (h) (ii) (iii) (a) (b) (c) (d) 208 17.29 17.29 13.16A(1) 13.18 (a) (b) 13.16A (b) 12 (a) 209 13.19 (a) 13.16A 12 13.18(1) 13.18(4) 155 17.43(1) (4) (b) 13.19 17.43 17.29

More information

bnbqw.PDF

bnbqw.PDF 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ( ( 1 2 16 1608 100004 1 ( 2003 2002 6 30 12 31 7 2,768,544 3,140,926 8 29,054,561 40,313,774 9 11,815,996 10,566,353 11 10,007,641 9,052,657 12 4,344,697

More information

第三章

第三章 第 三 章 :2017 年 行 政 長 官 產 生 辦 法 - 可 考 慮 的 議 題 行 政 長 官 的 憲 制 及 法 律 地 位 3.01 基 本 法 第 四 十 三 條 規 定 : 香 港 特 別 行 政 區 行 政 長 官 是 香 港 特 別 行 政 區 的 首 長, 代 表 香 港 特 別 行 政 區 香 港 特 別 行 政 區 行 政 長 官 依 照 本 法 的 規 定 對 中 央 人

More information

nb.PDF

nb.PDF 3 4 5 7 8 9..10..15..16..19..52 -3,402,247-699,783-1,611,620 1,790,627 : - - -7,493 - -1,687 2,863 1,176 2,863 - -148,617 - - 12,131 51,325 - -12,131-2,165 14-2,157 8-3,393,968-794,198-1,620,094 1,781,367

More information

Microsoft Word - 發布版---規範_全文_.doc

Microsoft Word - 發布版---規範_全文_.doc 建 築 物 無 障 礙 設 施 設 計 規 範 內 政 部 97 年 4 年 10 日 台 內 營 字 第 0970802190 號 令 訂 定, 自 97 年 7 月 1 日 生 效 內 政 部 97 年 12 年 19 日 台 內 營 字 第 0970809360 號 令 修 正 內 政 部 101 年 11 年 16 日 台 內 營 字 第 1010810415 號 令 修 正 目 錄 第 一

More information

概 述 随 着 中 国 高 等 教 育 数 量 扩 张 目 标 的 逐 步 实 现, 提 高 教 育 质 量 的 重 要 性 日 益 凸 显 发 布 高 校 毕 业 生 就 业 质 量 年 度 报 告, 是 高 等 学 校 建 立 健 全 就 业 状 况 反 馈 机 制 引 导 高 校 优 化 招

概 述 随 着 中 国 高 等 教 育 数 量 扩 张 目 标 的 逐 步 实 现, 提 高 教 育 质 量 的 重 要 性 日 益 凸 显 发 布 高 校 毕 业 生 就 业 质 量 年 度 报 告, 是 高 等 学 校 建 立 健 全 就 业 状 况 反 馈 机 制 引 导 高 校 优 化 招 I 概 述 随 着 中 国 高 等 教 育 数 量 扩 张 目 标 的 逐 步 实 现, 提 高 教 育 质 量 的 重 要 性 日 益 凸 显 发 布 高 校 毕 业 生 就 业 质 量 年 度 报 告, 是 高 等 学 校 建 立 健 全 就 业 状 况 反 馈 机 制 引 导 高 校 优 化 招 生 和 专 业 结 构 改 进 人 才 培 养 模 式 及 时 回 应 社 会 关 切 的 一 项

More information

鱼类丰产养殖技术(二).doc

鱼类丰产养殖技术(二).doc ...1...1...4...15...18...19...24...26...31...35...39...48...57...60...62...66...68...72 I ...73...88...91...92... 100... 104... 144... 146... 146... 147... 148... 148... 148... 149... 149... 150... 151...

More information

疾病诊治实务(一)

疾病诊治实务(一) ...1...4...5...8...13...14...15...18...18...19...22...25...26...27...29...30...32...35 I ...38...42...43...45...48...51...53...56...59...60...60...61...63...65...67...69...72...74...77...80...82...84 II

More information

名人养生.doc

名人养生.doc I...1...3...4...6... 11...14...18...22...26...29...31...38...45...49...56...57...59...61...67 ...72...73...75...77...80...83...85...91...92...93...95...96...97... 103... 107... 109... 110... 112... 118...

More information

<4D6963726F736F667420576F7264202D2040B9C5B871A661B0CFABC8AE61C2A7AB55ACE3A8735FA7F5ABD8BFB3B9C5B871A661B0CFABC8AE61C2A7AB55ACE3A8732E646F63>

<4D6963726F736F667420576F7264202D2040B9C5B871A661B0CFABC8AE61C2A7AB55ACE3A8735FA7F5ABD8BFB3B9C5B871A661B0CFABC8AE61C2A7AB55ACE3A8732E646F63> 嘉 義 地 區 客 家 禮 俗 研 究 第 一 章 前 言 嘉 義 地 區 的 客 家 族 群 約 略 可 分 為 福 佬 客 詔 安 客 與 北 部 客 等 三 種 類 別, 其 分 佈 區 域 以 海 線 地 區 平 原 地 形 沿 山 地 區 為 主 有 相 當 多 的 北 部 客 家 人, 是 二 次 大 戰 末 期 和 戰 後 初 期 才 移 民 嘉 義, 是 什 麼 因 素 令 許 多

More information

05301930

05301930 國 立 中 正 大 學 法 學 系 碩 士 論 文 河 川 砂 石 法 規 範 之 探 討 - 以 採 取 土 石 及 挖 掘 河 川 認 定 基 準 為 主 指 導 教 授 : 盧 映 潔 博 士 研 究 生 : 王 瑞 德 中 華 民 國 一 百 零 一 年 五 月 目 錄 第 一 章 緒 論... 1 第 一 節 研 究 動 機... 1 第 二 節 研 究 目 的... 3 第 三 節 研

More information

中老年保健必读(十).doc

中老年保健必读(十).doc ...1...2...3...4...5...6...8...9... 11 - -...13...15...17...18...20...22...23...25...26...28 I II...30...32...34...35...38...40...42...44...46...47...48...50...52...53 X...55...56...57...58...60...61...63...65

More information

23 29 15.6% 23 29 26.2% 3 25 2 15 1 5 1,542 12,336 14,53 16,165 18,934 22,698 25,125 25 2 15 1 5 5,557 7,48 8,877 11, 13,732 17,283 22,485 23 24 25 26

23 29 15.6% 23 29 26.2% 3 25 2 15 1 5 1,542 12,336 14,53 16,165 18,934 22,698 25,125 25 2 15 1 5 5,557 7,48 8,877 11, 13,732 17,283 22,485 23 24 25 26 4, 197823 2916.3%29 335, 23 29.5% 23 29 16.3% 14 35 33,535 14 135 13 125 1,292 1,3 1,38 1,314 1,321 1,328 1,335 3 25 2 15 1 5 1. 1.1 13,582 15,988 1.4 18,322 11.6 11.9 21,192 24,953 3,67 9. 8.7 12 1 8

More information

海淀区、房山区(四)

海淀区、房山区(四) ...1...1...2...7...8...9... 11... 15... 17... 17... 18... 19... 20... 21... 23... 25... 28... 31... 32 I ... 35... 36... 37... 39... 42... 43... 48... 53... 54... 58... 63... 64... 65... 66... 68... 71...

More information

穨ecr1_c.PDF

穨ecr1_c.PDF i ii iii iv 1 2 3 4 5 5555522 6664422 77722 6 7 8 9 10 11 22266 12833 1894 12 13 14 15 16 17 18 19 20 21 22 23 24 25 8.14 2.15 2.18 26 27 28 29 30 31 2.16 2.18 5.23 32 33 34 35 36 37 38 39 40 41 42 43

More information

穨2005_-c.PDF

穨2005_-c.PDF 2005 10 1 1 1 2 2 3 5 4 6 2 7 3 11 4 1 13 2 13 3 14 4 14 5 15 6 16 7 16 8 17 9 18 10 18 2005 10 1 1. 1.1 2 1.2 / / 1.3 69(2) 70(2) 1.4 1.5 1.6 2005 10 1 2. 2.1 2.2 485 20(8) (a) (i) (ii) (iii) (iv) 571

More information

北京理工大学.doc

北京理工大学.doc ( )...1...6...8...10...20...22...24...28...30...32...40 I ...53...55...61 ( )...62...71...74 ( )...77...81...84...86...88...89...91...92...96...99... 110...111... 112 II ... 113... 114... 115... 116...

More information

尲㐵.⸮⸮⸮⸮⸮

尲㐵.⸮⸮⸮⸮⸮ I...1...2...3...4...5...6...8...9...10... 11...12...13...14...15...16...17...18...19...20...21...22...23...24...26 II...27...28...28...29...30...31...32...34...35...36...37...38...39...39...40...41...43...43...44...45...46...47...48...48...49...50

More information

东城区(下)

东城区(下) ...1...1...2...3...9...9... 12... 12... 17... 17... 18... 19... 20... 29... 31... 37... 41... 70... 73 I ... 74... 78... 78... 79... 80... 85... 86... 88... 90... 90... 90... 92... 93... 95... 95... 96...

More information

果树高产栽培技术(一).doc

果树高产栽培技术(一).doc ( ) ...1...1...3...10... 11...12...15...17...18...19...20...22...23...24...26...27...28...30...31...32 I ...36...38...40...41...42...44...45...47...48...49...50...51...52...53...55...58...59...60...61...62...66...67

More information

物质结构_二_.doc

物质结构_二_.doc I...1...3...6...8 --... 11 --...12 --...13 --...15 --...16 --...18 --...19 --...20 --...22 --...24 --...25 --...26 --...28 --...30 --...32 --...34 --...35 --...37 --...38...40 II...41...44...46...47...48...49...51...52...55...58

More information

第一節 研究動機與目的

第一節 研究動機與目的 中 國 文 化 大 學 中 國 文 學 研 究 所 碩 士 論 文 華 嚴 一 真 法 界 思 想 研 究 指 導 教 授 : 王 俊 彥 研 究 生 : 許 瑞 菁 中 華 民 國 98 年 12 月 自 序 在 佛 教 經 典 中 最 初 接 觸 的 是 佛 說 無 量 壽 經, 此 經 乃 大 方 廣 佛 華 嚴 經 的 精 華 版 綱 要 版 為 了 瞭 解 經 義, 深 知 宇 宙 運

More information

水力发电(九)

水力发电(九) ...1...17...20...26...27...30...33...34...36...37...44...47...49...58...77...79...90...96...107 I ...114...115...132...134...137...138...139...140...142...142...144...146...146...146...148...148...149...149...150...151...151...152

More information

中国古代文学家(八).doc

中国古代文学家(八).doc ...1...5...26...27...43...44...48...50...52...54...55...57...60...61...62...63...65...67...68 I ...69...70...71...75...77...78...82...84...95...98...99... 101... 103... 107... 108... 109... 110...111...

More information

景观植物(一)

景观植物(一) ...1...5...6...8... 11...13...15...18...21...23...26...29...43...51 5...53...58...62...63...65 I ...67...70...72...74...76...77...78...80...81...84...85...87...88...90...92...94...97... 109... 113... 115...

More information

Microsoft Word - 目录.doc

Microsoft Word - 目录.doc 教 学 管 理 文 件 汇 编 目 录 教 育 法 规 和 指 导 性 文 件 1. 中 华 人 民 共 和 国 高 等 教 育 法 1 2. 中 华 人 民 共 和 国 教 师 法 8 3. 普 通 高 等 学 校 学 生 管 理 规 定 12 4. 高 等 学 校 学 生 行 为 准 则 18 5. 中 华 人 民 共 和 国 学 位 条 例 19 6. 高 等 学 校 教 学 管 理 要 点

More information

园林植物卷(三).doc

园林植物卷(三).doc I II III IV 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 84k 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

More information

厨房小知识_一_

厨房小知识_一_ ... 1... 1... 2... 3... 3... 5... 6... 7... 7... 8... 10...11... 12... 13... 15... 17... 18... 19... 19... 20... 23... 24... 24 ... 26... 26... 29... 30... 31... 32... 33... 34... 37... 38... 40... 41...

More information

中南财经大学(七).doc

中南财经大学(七).doc ...1...16...20...22...31...32...34...37...38...40...44...46...54...58...59...60...61 I ...62...63...70...77...79...81...84...90...93...95...95...97... 100... 102... 104... 105... 106... 107... 109... 113

More information

1................................... 1................................... 2......................................... 3......................................... 4.............................. 5.........................................

More information

赵飞燕外传、四美艳史演义

赵飞燕外传、四美艳史演义 \ I... 1...1...8... 9... 9...9...11...13...16...19...22...25...28...33...36...39...42 II...46...48...51...55...58...62... 67...67...70...73...76...79...83...86...89...92...96...99... 102... 105... 108...

More information

厨房小知识(五)

厨房小知识(五) I...1...2...3...4...5...6 ()...7 ()...9...10...10... 11...12...13...14...15...15...16...18...19...20...20...21...21 II...24...27...28...29...29...31...32...33...34...35...36...38...38...39...40...40...41...42...42...43...44...44...47...48...50...50

More information

最新监察执法全书(十八).doc

最新监察执法全书(十八).doc .............. I ..................................................... II .......................................... III ... 2003......... IV ,

More information

园林植物卷(十二).doc

园林植物卷(十二).doc ... 1... 4... 8... 8... 9... 9...11... 13... 15... 20... 23... 30... 31... 36... 39... 40... 43 I ... 47... 52... 57... 60 1... 65 2... 71 (3)... 78... 81... 87... 89... 91... 94... 95... 97 ( )... 100...

More information

华东师范大学.doc

华东师范大学.doc ...1...3...4...5...6...7 ( )...9 ( )...10...16...19...21...22...23...27...27...31...31 I II...33...34 ( )...36 () ( )...44 () ( ) ( )...49 ( )...54...56...60 ( )...64...70...81...89 2004...95...97...99...

More information

國立中山大學學位論文典藏

國立中山大學學位論文典藏 I...1...1...4...4...6...6...13...24...29...44...44...45...46...47...48...50...50...56...60...64...68...73...73...85...92...99...105...113...121...127 ...127...131...135...142...145...148 II III IV 1 2

More information

乳业竞争_一_

乳业竞争_一_ ...1...7...10... 11...14...17...18...19...21...23...25...26...28 50...30...31 48...31 3000...34...35...37 I ...40...44...45...48...50...51...55...56...58...58...60 ()...62 ()...66...71...72...72...73...76...77

More information

最新执法工作手册(十).doc

最新执法工作手册(十).doc ......................................... I ......... 2003....................................... II III............................................................ IV..............................................................

More information

untitled

untitled ...1 1...1...3...5...6...8...8...15...16...19 21...21...24...25...26...29...30...33...36...38...41...41 ( )...41...42...48...48...57...57...63...67...67...67...67...71...74 I ...76...76...79...81...82...82...83...83...83...84...84...85...85...85

More information