Node.js SDK开发指南

Size: px
Start display at page:

Download "Node.js SDK开发指南"

Transcription

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

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

3 目录 目录 1 相关资源 SDK 下载 示例程序 技术支持渠道 快速入门 使用前需知 OBS 服务环境搭建 开发环境准备 安装 SDK 获取服务地址 初始化 OBS 客户端 创建桶 上传对象 下载对象 列举对象 删除对象 OBS 客户端通用示例 预定义常量 初始化 配置密钥 创建 OBS 客户端 配置 OBS 客户端 配置 SDK 日志 配置 SDK 验证服务端证书 管理桶 创建桶 列举桶 删除桶 判断桶是否存在 获取桶元数据 管理桶访问权限 管理桶策略 文档版本 07 ( ) 版权所有 华为技术有限公司 ii

4 目录 4.8 获取桶区域位置 获取桶存量信息 桶配额 桶存储类型 上传对象 对象上传简介 文本上传 流式上传 文件上传 创建文件夹 设置对象属性 分段上传 设置对象生命周期 追加上传 分段复制 断点续传上传 基于表单上传 下载对象 对象下载简介 文本下载 流式下载 文件下载 范围下载 限定条件下载 重写响应头 获取自定义元数据 下载归档存储对象 断点续传下载 图片处理 管理对象 获取对象属性 管理对象访问权限 列举对象 删除对象 复制对象 授权访问 使用 URL 进行授权访问 多版本控制 多版本控制简介 设置桶多版本状态 文档版本 07 ( ) 版权所有 华为技术有限公司 iii

5 目录 9.3 查看桶多版本状态 获取多版本对象 复制多版本对象 取回多版本归档存储对象 列举多版本对象 多版本对象权限 删除多版本对象 生命周期管理 生命周期管理简介 设置生命周期规则 查看生命周期规则 删除生命周期规则 跨域资源共享 跨域资源共享简介 设置跨域规则 查看跨域规则 删除跨域规则 设置访问日志 日志简介 开启桶日志 查看桶日志配置 关闭桶日志 静态网站托管 静态网站托管简介 网站文件托管 设置托管配置 查看托管配置 清除托管配置 标签管理 标签简介 设置桶标签 查看桶标签 删除桶标签 事件通知 事件通知简介 设置事件通知 查看事件通知 关闭事件通知 服务端加密 服务端加密简介 文档版本 07 ( ) 版权所有 华为技术有限公司 iv

6 目录 16.2 加密 加密示例 异常处理 OBS 服务端错误码 SDK 公共结果对象 日志分析 缺少模块异常 连接超时异常 签名不匹配异常 常见问题 如何进行分段上传 如何创建文件夹 如何列出所有对象 如何使用 URL 进行授权访问 如何使用表单上传 如何分段下载大对象 如何验证服务端根证书 如何使对象可以被匿名用户访问 如何确定 OBS 服务地址和区域信息 如何获取访问密钥 如何使用 npm 下载 SDK A API 参考 B 修订记录 文档版本 07 ( ) 版权所有 华为技术有限公司 v

7 1 相关资源 1 相关资源 1.1 SDK 下载 下载地址 OBS Node.js SDK 最新版本 :OBS Node.js SDK OBS Node.js SDK 历史版本下载 : OBS Node.js SDK OBS Node.js SDK OBS Node.js SDK OBS Node.js SDK OBS Node.js SDK SDK 源码和 API 文档 SDK 源码请参见 :GitHub 接口参考文档地址 :SDK API 文档 兼容性 版本修订记录信息 :ChangeLog 推荐使用的 Node.js 版本 :Node 0.12.x,Node4.x,Node6.x,Node8.x,Node10.x 接口函数 : 与旧版本 (2.1.x) 不完全兼容, 接口变化如下表 : 接口函数 ObsClient.listBuckets ObsClient.setBucketAcl ObsClient.getBucketAcl 变化 响应结果中 InterfaceResult.Buckets 字段变为数组, 去掉 InterfaceResult.Buckets.Bucket 字段 请求参数中 Grants 字段变为数组, 去掉 Grants.Grant 字段 响应结果中 InterfaceResult.Grants 字段变为数组, 去掉 InterfaceResult.Grants.Grant 字段 文档版本 07 ( ) 版权所有 华为技术有限公司 1

8 1 相关资源 接口函数 ObsClient.setObjectAcl ObsClient.getObjectAcl ObsClient.setBucketLog ging ObsClient.getBucketLog ging ObsClient.setBucketWeb site ObsClient.getBucketWe bsite ObsClient.setBucketCor s ObsClient.getBucketCor s ObsClient.setBucketTag ging ObsClient.getBucketTag ging 变化 请求参数中 Grants 字段变为数组, 去掉 Grants.Grant 字段 响应结果中 InterfaceResult.Grants 字段变为数组, 去掉 InterfaceResult.Grants.Grant 字段 请求参数中 LoggingEnabled.TargetGrants 字段变为数组, 去掉 LoggingEnabled.TargetGrants.Grant 字段 响应结果中 InterfaceResult.LoggingEnabled.TargetGrants 字段变为数组, 去掉 InterfaceResult.LoggingEnabled.TargetGrants.Grant 字段 请求参数中 RoutingRules 字段变为数组, 去掉 RoutingRules.RoutingRule 字段 响应结果中 InterfaceResult.RoutingRules 字段变为数组, 去掉 InterfaceResult.RoutingRules.RoutingRule 字段 请求参数中 CorsRule 字段改名为 CorsRules 响应结果中 InterfaceResult.CorsRule 字段改名为 InterfaceResult.CorsRules 请求参数中 TagSet 字段改名为 Tags 并变为数组, 去掉 TagSet.Tag 字段 响应结果中 InterfaceResult.TagSet 字段改名为 Tags 并变为数组, 去掉 InterfaceResult.TagSet.Tag 字段 1.2 示例程序 OBS Node.js SDK 提供了丰富的示例程序, 方便用户参考或直接使用 您可以从 OBS Node.js SDK 开发包中获取示例程序, 如 esdk_storage_obs_<versionid>_node.js.zip, 解压后 esdk_storage_obs_<versionid>_node.js/examples 为示例程序 您也可以从下面表格中直接下载示例程序 示例包括以下内容 : 示例代码 bucket-operations-sample object-operations-sample download-sample create-folder-sample 展示了桶相关接口的用法展示了对象相关接口的用法展示了下载对象的用法展示了创建文件夹的用法 文档版本 07 ( ) 版权所有 华为技术有限公司 2

9 1 相关资源 示例代码 delete-objects-sample list-objects-sample list-versions-sample list-objects-infolder-sample object-meta-sample simple-multipart-upload-sample restore-object-sample concurrent-copypart-sample concurrent-download-object-sample concurrent-uploadpart-sample post-object-sample temporary-signature-sample 展示了批量删除对象的用法展示了列举对象的用法展示了列举多版本对象的用法展示了列举文件夹内对象的用法展示了自定义对象元数据的用法展示了分段上传的基本用法展示了下载归档存储对象的用法展示了分段并发复制大对象的用法展示了分段并发下载大对象的用法展示了分段并发上传大对象的用法展示了表单上传对象的用法展示了使用 URL 进行授权访问的用法 1.3 技术支持渠道 开发者社区提供的技术支持渠道如下 : 开发过程中, 您有任何问题可以在华为云论坛中发帖求助 文档版本 07 ( ) 版权所有 华为技术有限公司 3

10 2 快速入门 2 快速入门 2.1 使用前需知 请确认您已经熟悉 OBS 的基本概念, 如桶 (Bucket) 对象 (Object) 访问密钥 (AK 和 SK) 等 您可以先参考 OBS 客户端通用示例, 了解 OBS Node.js SDK 接口调用的通用方式 OBS 客户端支持回调函数和 Promise 对象两种方式返回调用结果 2.2 OBS 服务环境搭建 步骤 1 注册云服务账号 使用 OBS 之前必须要有一个云服务账号 1. 打开浏览器 2. 登录公有云网站 3. 在页面右上角单击 注册 4. 按需填写注册信息并单击 同意协议并注册 步骤 2 开通 OBS 服务 使用 OBS 服务之前必须先充值, 才能正常使用 OBS 服务 1. 登录 OBS 管理控制台 2. 单击页面右上角的用户名并选择 用户中心 进入用户中心页面 3. 单击 充值, 系统自动跳转到充值窗口 4. 根据界面提示信息, 对账户进行充值 5. 充值成功后, 关闭充值窗口, 返回管理控制台首页 6. 单击, 开通并进入 OBS 管理控制台 步骤 3 创建访问密钥 OBS 通过用户账户中的 AK 和 SK 进行签名验证, 确保通过授权的账户才能访问指定的 OBS 资源 以下是对 AK 和 SK 的解释 : 文档版本 07 ( ) 版权所有 华为技术有限公司 4

11 2 快速入门 AK:Access Key ID, 接入键标识, 用户在系统中的接入键标识, 一个接入键标识唯一对应一个用户, 一个用户可以同时拥有多个接入键标识 系统通过接入键标识识别访问系统的用户 SK:Secret Access Key, 安全接入键, 用户在系统中的安全接入键, 是用户访问系统的密钥, 用户根据安全接入键和请求头域生成鉴权信息 安全接入键和接入键标识一一对应 创建访问密钥的操作步骤如下 : 1. 登录 OBS 控制台 2. 单击页面右上角的用户名, 并选择 我的凭证 3. 进入 我的凭证 页面, 单击 管理访问密钥 页签下方的 新增访问密钥 4. 在弹出的 新增访问密钥 对话框中, 输入登录密码和对应验证码 用户如果未绑定邮箱和手机, 则只需输入登录密码 用户如果同时绑定了邮箱和手机, 可以选择其中一种方式进行验证 5. 单击 确定 6. 在弹出的 下载确认 提示框中, 单击 确定 后, 密钥会直接保存到浏览器默认的下载文件夹中 7. 打开下载下来的 credentials.csv 文件既可获取到访问密钥 (AK 和 SK) ---- 结束 每个用户最多可创建两个有效的访问密钥 为防止访问密钥泄露, 建议您将其保存到安全的位置 如果用户在此提示框中单击 取消, 则不会下载密钥, 后续也将无法重新下载 如果需要使用访问密钥, 可以重新创建新的访问密钥 2.3 开发环境准备 从 Node.js 官网下载并安装推荐使用的版本 从 Eclipse 官网下载并安装 Eclipse IDE for JavaScript and Web Developer 最新版本 2.4 安装 SDK 使用 npm 安装 ( 推荐 ) 步骤 1 步骤 2 运行 npm -v 命令查看 npm 版本并确保 npm 已安装 运行 npm install esdk-obs-nodejs 命令执行安装 ---- 结束 文档版本 07 ( ) 版权所有 华为技术有限公司 5

12 2 快速入门 如果您使用的是 Windows 操作系统, 当运行 npm 命令时提示 不是内部或外部命令, 请在 Path 环境变量中增加 npm 的安装目录 ( 一般为 Node.js 的安装目录 ) 您可能需要重启电脑使环境变量生效 如果您使用 npm 安装依赖时出现网络错误, 请使用代理 使用源码安装 以安装 OBS Node.js SDK 最新版本为例, 步骤如下 : 步骤 1 步骤 2 步骤 3 步骤 4 下载 OBS Node.js SDK 开发包 解压该开发包, 可以看到其中包含 examples 文件夹 ( 示例代码 ),lib 文件夹 (SDK 源码 ),package.json 文件 ( 依赖配置文件 ) 和 README.txt(SDK 版本特性描述文件 ) 命令行切换到 SDK 开发包解压目录, 运行 npm install 安装依赖库, 生成 node_modules 文件夹 ( 可选 ) 在 Eclipse JavaScript 项目中导入源码 打开 Eclipse JavaScript IDE, 选择 Import > Projects from Folder or Archive, 并在 Import source 中选择 SDK 开发包解压目录 ---- 结束 安装完成后, 您的目录结构应该像下面这样 : examples lib node_modules package.json README.txt 2.5 获取服务地址 您可以从这里查看 OBS 当前开通的服务地址和区域信息 SDK 支持带协议名和不带协议名两种方式传入服务地址, 例如获取到的服务地址为 your-endpoint, 则初始化 OBS 客户端时传入的服务地址可以为 和 your-endpoint 三种形式 2.6 初始化 OBS 客户端 向 OBS 发送任一 HTTP/HTTPS 请求之前, 必须先创建一个 ObsClient 实例 : 文档版本 07 ( ) 版权所有 华为技术有限公司 6

13 2 快速入门 // 使用访问 OBS // 关闭 obsclient obsclient.close(); 更多关于 OBS 客户端初始化的内容请参考 初始化 章节 2.7 创建桶 桶是 OBS 全局命名空间, 相当于数据的容器 文件系统的根目录, 可以存储若干对象 以下代码展示如何新建一个桶 : obsclient.createbucket({ console.error('error-->' + err); 桶的名字是全局唯一的, 所以您需要确保不与已有的桶名称重复 桶命名规则如下 : 3~63 个字符, 数字或字母开头, 支持小写字母 数字 -. 禁止使用类 IP 地址 禁止以 - 或. 开头及结尾 禁止两个. 相邻 ( 如 : my..bucket ) 禁止. 和 - 相邻 ( 如 : my-.bucket 和 my.-bucket ) 同一用户多次创建同名桶不会报错, 创建的桶属性以第一次请求为准 更多创建桶的信息, 请参见创建桶 创建桶时, 如果使用的终端节点归属于默认区域华北 - 北京一 (cn-north-1), 则可以不指定区域 ; 如果使用的终端节点归属于其他区域, 则必须指定区域, 且指定的区域必须与终端节点归属的区域一致 当前有效的区域名称有 :cn-north-1 cneast-2 cn-south-1 ap-southeast-1 您可以使用带参数创建方式, 在创建桶时, 指定桶的区域位置 2.8 上传对象 以下代码展示如何上传对象至 OBS: obsclient.putobject({ 文档版本 07 ( ) 版权所有 华为技术有限公司 7

14 2 快速入门 Key : 'objectname', Body : 'Hello OBS' console.error('error-->' + err); 更多上传对象的信息, 请参见上传对象 2.9 下载对象 以下代码展示如何获取对象的内容 : obsclient.getobject({ Key : 'objectname' console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log(result.interfaceresult.content.tostring()); 更多下载对象的信息, 请参见下载对象 2.10 列举对象 当完成一系列上传对象操作后, 可能需要查看桶中包含哪些对象 以下代码展示如何列举指定桶中的对象 : obsclient.listobjects({ Bucket : 'bucketname' console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ for(let i=0;i<result.interfaceresult.contents.length;i++){ console.log('contents[' + j + ']:'); console.log('key-->' + result.interfaceresult.contents[j]['key']); console.log('lastmodified-->' + result.interfaceresult.contents[j] ['LastModified']); console.log('size-->' + result.interfaceresult.contents[j]['size']); 上面的代码默认列举 1000 个对象 (Object) 更丰富的列举功能, 请参见列举对象 文档版本 07 ( ) 版权所有 华为技术有限公司 8

15 2 快速入门 2.11 删除对象 以下代码展示如何删除指定的对象 : obsclient.deleteobject({ Key : 'objectname' console.error('error-->' + err); 2.12 OBS 客户端通用示例 回调函数返回结果 : OBS 客户端可通过回调函数的形式返回结果, 回调函数依次包含异常信息和 SDK 公共结果对象两个参数 如果回调函数中异常信息参数不为空, 则表明接口调用异常 ; 反之, 则表明接口调用完成, 此时应从 SDK 公共结果对象中获取 HTTP 状态码, 判断操作是否成功 示例代码如下 : // 构造桶操作请求参数 var requestparam1 = { Bucket : 'bucketname' // 其他字段 ; var callback1 = (err, result) => { // 处理桶操作调用结果 ; // 调用桶操作接口, 如创建桶 obsclient.createbucket(requestparam1, callback1); // 构造对象操作请求参数 var requestparam2 = { Key : 'objectname' // 其他字段 ; var callback2 = (err, result) => { // 处理对象操作调用结果 ; // 调用对象操作接口, 如下载对象 obsclient.getobject(requestparam2, callback2); 文档版本 07 ( ) 版权所有 华为技术有限公司 9

16 2 快速入门 对于桶操作接口, 请求对象中固定包含 Bucket 字段用于指定桶名 ; 对于对象操作接口, 请求对象中固定包含 Bucket 字段和 Key 字段分别用于指定桶名与对象名 以下代码展示了使用回调函数返回调用结果的通用示例 : // 调用接口进行操作, 例如上传对象 obsclient.putobject({ Key : 'objectname', Body : 'Hello OBS' // 异常信息不为空, 表明接口调用异常 console.log('error-->' + err); // 异常信息为空, 表明接口调用完成, 应进一步判断 HTTP 状态码 if(result.commonmsg.status < 300){// 操作成功 if(result.interfaceresult){ // 处理操作成功后业务逻辑 // 操作失败, 获取详细异常信息 console.log('code-->' + result.commonmsg.code); console.log('message-->' + result.commonmsg.message); console.log('hostid-->' + result.commonmsg.hostid); console.log('requestid-->' + result.commonmsg.requestid); Promise 对象返回结果 : OBS 客户端可通过 Promise 对象返回结果, 如果通过 Promise 对象的 catch 方法没有捕获到异常, 则表明接口调用完成, 此时应从 SDK 公共结果对象中获取 HTTP 状态码, 判断操作是否成功 示例代码如下 : // 构造桶操作请求参数 var requestparam1 = { Bucket : 'bucketname' // 其他字段 ; 文档版本 07 ( ) 版权所有 华为技术有限公司 10

17 2 快速入门 // 调用桶操作接口, 如创建桶 var promise1 = obsclient.createbucket(requestparam1); promise1.then((result) => { // 处理桶操作调用结果 ).catch((err)=>{ // 处理错误 // 构造对象操作请求参数 var requestparam2 = { Key : 'objectname' // 其他字段 ; // 调用对象操作接口, 如下载对象 var promise2 = obsclient.getobject(requestparam2, callback2); promise2.then((result) => { // 处理对象操作调用结果 ).catch((err)=>{ // 处理错误 对于桶操作接口, 请求对象中固定包含 Bucket 字段用于指定桶名 ; 对于对象操作接口, 请求对象中固定包含 Bucket 字段和 Key 字段分别用于指定桶名与对象名 以下代码展示了使用 Promise 对象返回调用结果的通用示例 : // 调用接口进行操作, 例如上传对象 obsclient.putobject({ Key : 'objectname', Body : 'Hello OBS' ).then((result) => { // 接口调用完成, 应进一步判断 HTTP 状态码 if(result.commonmsg.status < 300){// 操作成功 if(result.interfaceresult){ // 处理操作成功后业务逻辑 // 操作失败, 获取详细异常信息 console.log('code-->' + result.commonmsg.code); console.log('message-->' + result.commonmsg.message); console.log('hostid-->' + result.commonmsg.hostid); console.log('requestid-->' + result.commonmsg.requestid); ).catch((err) => { // 接口调用发生异常 console.error('error-->' + err); 文档版本 07 ( ) 版权所有 华为技术有限公司 11

18 2 快速入门 2.13 预定义常量 OBS Node.js SDK 提供了一组预定义常量, 方便用户直接使用 您可以通过 ObsClient.enums 获取预定义常量对象 更多关于预定义常量的介绍详见 Node.js SDK API 参考 文档版本 07 ( ) 版权所有 华为技术有限公司 12

19 3 初始化 3 初始化 3.1 配置密钥 要接入 OBS 服务, 您需要拥有一组有效的访问密钥 (AK 和 SK) 用来进行签名认证 具体可参考 OBS 服务环境搭建 获取 AK 和 SK 之后, 您便可以按照以下步骤进行初始化 3.2 创建 OBS 客户端 通过构造函数创建 OBS 客户端 (ObsClient) 是访问 OBS 服务的 Node.js 客户端, 它为调用者提供一系列与 OBS 服务进行交互的接口, 用于管理 操作桶 (Bucket) 和对象 (Object) 等 OBS 服务上的资源 使用 OBS Node.js SDK 发起 OBS 请求, 您需要初始化一个 ObsClient 实例, 并根据需要修改客户端初始化配置参数 // 通过构造函数创建 ObsClient 实例 // 使用访问 OBS // 关闭 obsclient obsclient.close(); 通过工厂方法创建 文档版本 07 ( ) 版权所有 华为技术有限公司 13

20 3 初始化 // 通过工厂方法初始化 ObsClient 实例 var obsclient = new ObsClient(); obsclient.factory({ // 使用访问 OBS // 关闭 obsclient obsclient.close(); 您的工程中可以有多个 ObsClient, 也可以只有一个 ObsClient ObsClient 在调用 ObsClient.close 方法关闭后不能再次使用 3.3 配置 OBS 客户端 您可通过初始化参数对 ObsClient 进行配置, 可以配置的参数见下表 : 参数 描述 建议值 access_key_id 访问密钥中的 AK N/A secret_access_key 访问密钥中的 SK N/A server max_retry_count 连接 OBS 的服务地址 可包含协议类型 域名 端口号 示例 : your-endpoint:443 HTTP/HTTPS 连接异常时的请求重试次数 默认为 3 次 N/A [1,5] timeout HTTP/HTTPS 请求超时时间 ( 单位 : 秒 ) 默认为 60 秒 ssl_verify 验证服务端证书参数 可能的取值 : 服务端 pem 格式根证书文件路径 ; true: 使用默认的 CAs 验证服务端证书 ; false: 表示不验证服务端证书 默认为 false [10, 60] N/A long_conn_param is_cname 长连接模式参数 ( 单位 : 秒 ) 当该参数大于等于 0 时, 开启长连接模式, 并将该参数作为 TCP Keep-Alive 数据包的初始延迟 默认为空, 代表关闭长连接模式 是否通过自定义域名访问 OBS 服务 默认为 false N/A N/A 文档版本 07 ( ) 版权所有 华为技术有限公司 14

21 3 初始化 建议值为 N/A 的表示需要根据实际情况进行设置 如网络状况不佳, 建议增大 timeout 的值 如果设置的 server 不带协议类型, 则默认使用 HTTPS 协议 如果启用了长连接模式, 使用完 OBS 客户端后必须调用 ObsClient.close 方法显式关闭, 回收连接资源 出于 DNS 解析性能和 OBS 服务可靠性的考虑, 不允许将 server 设置为 IP, 必须使用域名访问 OBS 服务 3.4 配置 SDK 日志 OBS Node.js SDK 基于 log4js 开源库提供了日志功能, 您可以通过 ObsClient.initLog 开启日志功能并进行配置 示例代码如下 : obsclient.initlog({ file_full_path:'./logs/obs-sdk.log', // 配置日志文件路径 max_log_size:20480, // 配置日志文件大小, 单位 : 字节 backups:10, // 配置最大可保留的日志文件个数 level:'warn', // 配置日志级别 log_to_console:true // 配置是否将日志打印到 console 日志功能默认是关闭的, 需要主动开启 您可以从日志分析章节获取更多关于 SDK 日志的信息 3.5 配置 SDK 验证服务端证书 OBS Node.js SDK 提供了对服务端证书验证的支持, 以确保 OBS 服务来自于受信服务端 配置验证服务端证书的步骤如下 : 步骤 1 步骤 2 获取 OBS 服务端的根证书 ( 例如从 IE 浏览器的 Internet 属性 > 内容 > 证书 中导出 ), 并保存为文件 obs.cer 运行命令 openssl x509 -inform der -in obs.cer -out obs.pem 将 cer 文件转换为 pem 文件 步骤 3 修改 OBS 客户端配置代码, 开启服务端证书验证, 示例代码如下 :,// 配置使用 HTTPS 协议 ssl_verify : 'your_cafile_dir/obs.pem' // 配置 pem 格式根证书文件路径 ---- 结束 文档版本 07 ( ) 版权所有 华为技术有限公司 15

22 4 管理桶 4 管理桶 4.1 创建桶 您可以通过 ObsClient.createBucket 创建桶 简单创建 以下代码展示如何新建一个桶 : // 创建桶 obsclient.createbucket({ Bucket : 'bucketname' console.error('error-->' + err); 文档版本 07 ( ) 版权所有 华为技术有限公司 16

23 4 管理桶 桶的名字是全局唯一的, 所以您需要确保不与已有的桶名称重复 桶命名规则如下 : 3~63 个字符, 数字或字母开头, 支持小写字母 数字 -. 禁止使用类 IP 地址 禁止以 - 或. 开头及结尾 禁止两个. 相邻 ( 如 : my..bucket ) 禁止. 和 - 相邻 ( 如 : my-.bucket 和 my.-bucket ) 同一用户在同一个区域多次创建同名桶不会报错, 创建的桶属性以第一次请求为准 本示例创建的桶的访问权限默认是私有读写, 存储类型默认是标准类型, 区域位置是全局域名所在的默认区域 创建桶时, 如果使用的终端节点归属于默认区域华北 - 北京一 (cn-north-1), 则可以不指定区域 ; 如果使用的终端节点归属于其他区域, 则必须指定区域, 且指定的区域必须与终端节点归属的区域一致 当前有效的区域名称有 :cn-north-1 cneast-2 cn-south-1 ap-southeast-1 您可以使用带参数创建方式, 在创建桶时, 指定桶的区域位置 带参数创建 创建桶时可以指定桶的访问权限 存储类型和区域位置 OBS 支持的桶的存储类型有三类, 参见桶存储类型 示例代码如下 : // 创建桶 obsclient.createbucket({ // 设置桶访问权限为公共读, 默认是私有读写 ACL : obsclient.enums.aclpublicread, // 设置桶的存储类型为归档存储类型 StorageClass : obsclient.enums.storageclasscold, // 设置桶区域位置 Location : 'bucketlocation' console.error('error-->' + err); 文档版本 07 ( ) 版权所有 华为技术有限公司 17

24 4 管理桶 使用 ACL 参数指定桶的访问权限 ; 使用 StorageClass 参数指定桶的存储类型 ; 使用 Location 参数指定桶的区域位置 4.2 列举桶 您可以通过 ObsClient.listBuckets 列举桶 以下代码展示如何获取桶列表 : // 列举桶 obsclient.listbuckets({ QueryLocation : true console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('requestid-->' + result.interfaceresult.requestid); console.log('owner:'); console.log('id-->' + result.interfaceresult.owner.id); console.log('name-->' + result.interfaceresult.owner.name); console.log('buckets:'); for(let i=0;i<result.interfaceresult.buckets.length;i++){ console.log('bucket[' + i + ']:'); console.log('bucketname-->' + result.interfaceresult.buckets[i].bucketname); console.log('creationdate-->' + result.interfaceresult.buckets[i].creationdate); console.log('location-->' + result.interfaceresult.buckets[i].location); 获取到的桶列表将按照桶名字典顺序排列 设置 QueryLocation 参数为 true 后, 可在列举桶时查询桶的区域位置 4.3 删除桶 您可以通过 ObsClient.deleteBucket 删除桶 以下代码展示如何删除一个桶 : 文档版本 07 ( ) 版权所有 华为技术有限公司 18

25 4 管理桶 // 删除桶 obsclient.deletebucket({ Bucket : 'bucketname' console.error('error-->' + err); 如果桶不为空 ( 包含对象或分段上传碎片 ), 则该桶无法删除 删除桶非幂等操作, 删除不存在的桶会失败 4.4 判断桶是否存在 您可以通过 ObsClient.headBucket 接口判断该桶是否已存在 以下代码展示如何判断指定桶是否存在 : obsclient.headbucket({ Bucket : 'bucketname' console.error('error-->' + err); if(result.commonmsg.status < 300){ console.log('bucket exists'); else if(result.commonmsg.status === 404){ console.log('bucket does not exist'); 如果返回的 HTTP 状态码为 404, 表明桶不存在 4.5 获取桶元数据 您可以通过 ObsClient.getBucketMetadata 接口获取桶元数据 以下代码展示如何获取桶元数据 : 文档版本 07 ( ) 版权所有 华为技术有限公司 19

26 4 管理桶 // 获取桶元数据 obsclient.getbucketmetadata({ Origin : ' console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('storageclass-->' + result.interfaceresult.storageclass); console.log('alloworigin-->' + result.interfaceresult.alloworigin); console.log('maxageseconds-->' + result.interfaceresult.maxageseconds); console.log('exposeheader-->' + result.interfaceresult.exposeheader); console.log('allowmethod-->' + result.interfaceresult.allowmethod); console.log('allowheader-->' + result.interfaceresult.allowheader); 4.6 管理桶访问权限 桶访问权限 (ACL) 可以通过三种方式设置 : 1. 创建桶时指定预定义访问策略 2. 调用 ObsClient.setBucketAcl 指定预定义访问策略 3. 调用 ObsClient.setBucketAcl 直接设置 OBS 支持的桶或对象权限包含五类, 见下表 : 权限 描述 OBS Node.js SDK 对应值 读权限 写权限 读 ACP 权限 若有桶的读权限, 则可以获取该桶内对象列表和桶的元数据 若有对象的读权限, 则可以获取该对象内容和元数据 若有桶的写权限, 则可以上传 覆盖和删除该桶内任何对象 此权限在对象上不适用 若有读 ACP 的权限, 则可以获取对应的桶或对象的权限控制列表 (ACL) 桶或对象的所有者永远拥有读对应桶或对象 ACP 的权限 ObsClient.enums.Permissio nread ObsClient.enums.Permissio nwrite ObsClient.enums.Permissio nreadacp 文档版本 07 ( ) 版权所有 华为技术有限公司 20

27 4 管理桶 权限描述 OBS Node.js SDK 对应值 写 ACP 权限 完全控制权限 若有写 ACP 的权限, 则可以更新对应桶或对象的权限控制列表 (ACL) 桶或对象的所有者永远拥有写对应桶或对象的 ACP 的权限 拥有了写 ACP 的权限, 由于可以更改权限控制策略, 实际上意味着拥有了完全访问的权限 若有桶的完全控制权限意味着拥有读权限 写权限 读 ACP 权限和写 ACP 权限的权限 若有对象的完全控制权限意味着拥有读权限 读 ACP 权限和写 ACP 权限的权限 ObsClient.enums.Permissio nwriteacp ObsClient.enums.Permissio nfullcontrol OBS 预定义的访问策略包含五类, 见下表 : 权限描述 OBS Node.js SDK 对应值 私有读写 公共读 公共读写 桶公共读, 桶内对象公共读 桶或对象的所有者拥有完全控制的权限, 其他任何人都没有访问权限 设在桶上, 所有人可以获取该桶内对象列表 桶内多段任务 桶的元数据 桶的多版本 设在对象上, 所有人可以获取该对象内容和元数据 设在桶上, 所有人可以获取该桶内对象列表 桶内多段任务 桶的元数据 上传对象删除对象 初始化段任务 上传段 合并段 拷贝段 取消多段上传任务 设在对象上, 所有人可以获取该对象内容和元数据 设在桶上, 所有人可以获取该桶内对象列表 桶内多段任务 桶的元数据, 可以获取该桶内对象的内容和元数据 不能应用于对象 ObsClient.enums.AclPrivate ObsClient.enums.AclPublic Read ObsClient.enums.AclPublic ReadWrite ObsClient.enums.AclPublic ReadDelivered 文档版本 07 ( ) 版权所有 华为技术有限公司 21

28 4 管理桶 权限描述 OBS Node.js SDK 对应值 桶公共读写, 桶内对象公共读写 设在桶上, 所有人可以获取该桶内对象列表 桶内多段任务 桶的元数据 上传对象 删除对象 初始化段任务 上传段 合并段 拷贝段 取消多段上传任务, 可以获取该桶内对象的内容和元数据 不能应用于对象 ObsClient.enums.AclPublic ReadWriteDelivered 创桶时指定预定义访问策略 以下代码展示如何在创建桶时指定预定义访问策略 : // 创建桶 obsclient.createbucket({ // 设置桶访问权限为公共读写 ACL : obsclient.enums.aclpublicreadwrite console.error('error-->' + err); 为桶设置预定义访问策略 以下代码展示如何为桶设置预定义访问策略 : // 用预定义访问策略设置桶权限 obsclient.setbucketacl({ // 设置桶访问权限为私有读写 文档版本 07 ( ) 版权所有 华为技术有限公司 22

29 4 管理桶 ACL : obsclient.enums.aclprivate console.error('error-->' + err); 使用 ACL 参数指定桶的访问权限 直接设置桶访问权限 获取桶访问权限 以下代码展示如何直接设置桶访问权限 : // 直接设置桶访问权限 obsclient.setbucketacl({ // 设置桶所有者 Owner:{'ID':'ownerid', Grants:[ // 为指定用户设置完全控制权限 { Grantee : {Type : 'CanonicalUser',ID : 'userid', Permission : obsclient.enums.permissionfullcontrol, // 为所有用户设置读权限 { Grantee : {Type : 'Group',URI : obsclient.enums.groupallusers, Permission : obsclient.enums.aclpublicread ] console.error('error-->' + err); 使用 Owner 参数指定桶的所有者信息 ; 使用 Grants 参数指定被授权的用户信息 ACL 中需要填写的所有者 (Owner) 或者被授权用户 (Grantee) 的 ID, 是指用户的账户 ID, 可通过 OBS 控制台 我的凭证 页面查看 当前 OBS 桶支持的可被授权的用户组为 : 所有用户 :ObsClient.enums.GroupAllUsers 您可以通过 ObsClient.getBucketAcl 获取桶的访问权限 以下代码展示如何获取桶访问权限 : 文档版本 07 ( ) 版权所有 华为技术有限公司 23

30 4 管理桶 obsclient.getbucketacl({ console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('requestid-->' + result.interfaceresult.requestid); console.log('owner[id]-->' + result.interfaceresult.owner.id); console.log('grants:'); for(let i=0;i<result.interfaceresult.grants.length;i++){ console.log('grant[' + i + ']:'); console.log('grantee[id]-->' + result.interfaceresult.grants[i] ['Grantee']['ID']); console.log('grantee[uri]-->' + result.interfaceresult.grants[i] ['Grantee']['URI']); console.log('permission-->' + result.interfaceresult.grants[i] ['Permission']); 4.7 管理桶策略 除了桶访问权限外, 桶的拥有者还可以通过桶策略, 提供对桶和桶内对象的集中访问控制 设置桶策略 更多关于桶策略的内容请参考桶策略 您可以通过 ObsClient.setBucketPolicy 设置桶策略 示例代码如下 : // 设置桶策略 obsclient.setbucketpolicy({ Policy : 'your policy' 文档版本 07 ( ) 版权所有 华为技术有限公司 24

31 4 管理桶 console.error('error-->' + err); 桶策略内容的具体格式 (JSON 格式字符串 ) 请参考 API 参考 获取桶策略 您可以通过 ObsClient.getBucketPolicy 获取桶策略 示例代码如下 : // 获取桶策略 obsclient.getbucketpolicy({ console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('policy-->' + result.interfaceresult.policy); 删除桶策略 您可以通过 ObsClient.deleteBucketPolicy 删除桶策略 示例代码如下 : // 删除桶策略 obsclient.deletebucketpolicy({ Bucket : 'bucketname' console.error('error-->' + err); 文档版本 07 ( ) 版权所有 华为技术有限公司 25

32 4 管理桶 4.8 获取桶区域位置 您可以通过 ObsClient.getBucketLocation 获取桶的区域位置 以下代码展示如何获取桶区域位置 : obsclient.getbucketlocation({ console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('location-->' + result.interfaceresult.location); 创建桶时可以指定桶的区域位置, 请参见创建桶 4.9 获取桶存量信息 桶存量信息包括桶的空间大小以及桶包含的对象个数 您可以通过 ObsClient.getBucketStorageInfo 获取桶的存量信息 以下代码展示如何获取桶存量信息 : obsclient.getbucketstorageinfo({ console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('size-->' + result.interfaceresult.size); console.log('objectnumber-->' + result.interfaceresult.objectnumber); 文档版本 07 ( ) 版权所有 华为技术有限公司 26

33 4 管理桶 4.10 桶配额 设置桶配额 您可以通过 ObsClient.setBucketQuota 设置桶配额 以下代码展示如何设置桶配额 : // 设置桶配额为 100MB obsclient.setbucketquota({ StorageQuota: 1024 * 1024 * 100 console.error('error-->' + err); 使用 StorageQuota 参数指定桶的配额大小 桶配额值必须为非负整数, 单位为字节, 支持的最大值为 获取桶配额 您可以通过 ObsClient.getBucketQuota 获取桶配额 以下代码展示如何获取桶配额 : obsclient.getbucketquota({ Bucket : 'bucketname' console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ 文档版本 07 ( ) 版权所有 华为技术有限公司 27

34 4 管理桶 console.log('storagequota-->' + result.interfaceresult.storagequota); 4.11 桶存储类型 OBS 允许您对桶配置不同的存储类型, 桶中对象的存储类型默认将与桶的存储类型保持一致 不同的存储类型可以满足客户业务对存储性能 成本的不同诉求 桶的存储类型分为三类, 见下表 : 类型 OBS Node.js SDK 对应 值 标准存储 低频访问存储 归档存储 标准存储拥有低访问时延和较高的吞吐量, 适用于有大量热点对象 ( 平均一个月多次 ) 或小对象 (<1MB), 且需要频繁访问数据的业务场景 低频访问存储适用于不频繁访问 ( 平均一年少于 12 次 ) 但在需要时也要求能够快速访问数据的业务场景 归档存储适用于很少访问 ( 平均一年访问一次 ) 数据的业务场景 ObsClient.enums.Storage ClassStandard ObsClient.enums.Storage ClassWarm ObsClient.enums.Storage ClassCold 更多关于桶存储类型的内容请参考桶的存储类别 设置桶存储类型 您可以通过 ObsClient.setBucketStoragePolicy 设置桶存储类型 以下代码展示如何设置桶存储类型 : obsclient.setbucketstoragepolicy({ StorageClass: obsclient.enums.storageclasswarm console.error('error-->' + err); 文档版本 07 ( ) 版权所有 华为技术有限公司 28

35 4 管理桶 使用 StorageClass 参数指定桶的存储类型 获取桶存储类型 您可以通过 ObsClient.getBucketStoragePolicy 获取桶存储类型 以下代码展示如何获取桶存储类型 : obsclient.getbucketstoragepolicy({ Bucket : 'bucketname' console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('storageclass-->' + result.interfaceresult.storageclass); 文档版本 07 ( ) 版权所有 华为技术有限公司 29

36 5 上传对象 5 上传对象 5.1 对象上传简介 在 OBS 中, 用户操作的基本数据单元是对象 OBS Node.js SDK 提供了丰富的对象上传接口, 可以通过以下方式上传对象 : 5.2 文本上传 5.3 流式上传 5.4 文件上传 5.7 分段上传 5.9 追加上传 5.11 断点续传上传 5.12 基于表单上传 SDK 支持上传 0kb~5GB 的对象 文本上传 流式上传 文件上传和追加上传每次上传内容大小不能超过 5GB; 当上传较大文件时, 请使用分段上传, 分段上传每段内容大小不能超过 5GB; 基于表单上传提供了基于浏览器表单上传对象的方式 若上传的对象权限设置为匿名用户读取权限, 对象上传成功后, 匿名用户可通过链接地址访问该对象数据 对象链接地址格式为 : 桶名. 域名 / 文件夹目录层级 / 对象名 如果该对象存在于桶的根目录下, 则链接地址将不需要有文件夹目录层级 5.2 文本上传 文本上传用于直接上传字符串 您可以通过 ObsClient.putObject 直接上传字符串到 OBS 以下代码展示了如何进行文本上传 : 文档版本 07 ( ) 版权所有 华为技术有限公司 30

37 5 上传对象 obsclient.putobject({ Key : 'objectname', Body : 'Hello OBS' console.error('error-->' + err); 使用 Body 参数指定待上传的字符串 上传内容大小不能超过 5GB 5.3 流式上传 流式上传使用 stream.readable 作为对象的数据源 以下代码展示了如何进行流式上传 : 上传网络流 var http = require('http'); // 创建网络流 http.get(' (res) => { obsclient.putobject({ Key : 'objectname', Body : res console.error('error-->' + err); 上传文件流 文档版本 07 ( ) 版权所有 华为技术有限公司 31

38 5 上传对象 var fs = require('fs'); obsclient.putobject({ Key : 'objectname', // 创建文件流, 其中 localfile 为待上传的本地文件路径, 需要指定到具体的文件名 Body : fs.createreadstream('localfile') console.error('error-->' + err); 使用 Body 参数指定待上传的流数据时, 其值必须是一个 stream.readable 实例 大文件上传建议使用分段上传 上传内容大小不能超过 5GB 5.4 文件上传 文件上传使用本地文件作为对象的数据源 以下代码展示了如何进行文件上传 : obsclient.putobject({ Key : 'objectname', SourceFile : 'localfile' // localfile 为待上传的本地文件路径, 需要指定到具体的文件名 console.error('error-->' + err); 使用 SourceFile 参数指定待上传的文件路径 SourceFile 参数和 Body 参数不能同时使用 上传内容大小不能超过 5GB 文档版本 07 ( ) 版权所有 华为技术有限公司 32

39 5 上传对象 5.5 创建文件夹 OBS 本身是没有文件夹的概念的, 桶中存储的元素只有对象 创建文件夹实际上是创建了一个大小为 0 且对象名以 / 结尾的对象, 这类对象与其他对象无任何差异, 可以进行下载 删除等操作, 只是 OBS 控制台会将这类以 / 结尾的对象以文件夹的方式展示 obsclient.putobject({ Key : 'parent_directory/' console.error('error-->' + err); // 在文件夹下创建对象 obsclient.putobject({ Key : 'parent_directory/objectname' console.error('error-->' + err); 创建文件夹本质上来说是创建了一个大小为 0 且对象名以 / 结尾的对象 多级文件夹创建最后一级即可, 比如 src1/src2/src3/, 创建 src1/src2/src3/ 即可, 无需创建 src1/ src1/src2/ 5.6 设置对象属性 您可以在上传对象时设置对象属性 对象属性包含对象长度 对象 MIME 类型 对象 MD5 值 ( 用于校验 ) 对象存储类型 对象自定义元数据 对象属性可以在多种上传方式下 ( 文本上传 流式上传 文件上传 分段上传 ), 或复制对象时进行设置 对象属性详细见下表 : 文档版本 07 ( ) 版权所有 华为技术有限公司 33

40 5 上传对象 名称描述默认值 对象长度 (Content- Length) 对象 MIME 类型 (Content- Type) 对象 MD5 值 (Content- MD5) 对象存储类型 对象自定义元数据 上传对象的长度, 超过流 / 文件的长度会截断 对象的 MIME 类型, 定义对象的类型及网页编码, 决定浏览器将以什么形式 什么编码读取对象 对象数据的 MD5 值 ( 经过 Base64 编码 ), 提供给 OBS 服务端, 校验数据完整性 对象的存储类型, 不同的存储类型可以满足客户业务对存储性能 成本的不同诉求 默认与桶的存储类型保持一致, 可以设置为与桶的存储类型不同 用户对上传到桶中对象的自定义属性描述, 以便对对象进行自定义管理 流 / 文件实际长度 binary/octet-stream 无无无 设置对象长度 obsclient.putobject({ Key : 'objectname', SourceFile : 'localfile', ContentLength : 1024 * 1024 // 1MB console.error('error-->' + err); 设置对象 MIME 类型 使用 ContentLength 参数指定对象长度 文档版本 07 ( ) 版权所有 华为技术有限公司 34

41 5 上传对象 // 上传图片 obsclient.putobject({ Key : 'objectname.jpg', SourceFile : 'localimage.jpg', ContentType : 'image/jpeg' console.error('error-->' + err); 使用 ContentType 参数指定对象 MIME 类型 如果不设置对象 MIME 类型,SDK 会根据上传对象的后缀名自动判断对象 MIME 类型, 如.xml 判断为 application/xml 文件 ;.html 判断为 text/html 文件 设置对象 MD5 值 obsclient.putobject({ Key : 'objectname', SourceFile : 'localimage.jpg', ContentMD5 : 'your md5 which should be encoded by base64' console.error('error-->' + err); 使用 ContentMD5 参数指定对象 MD5 值 对象数据的 MD5 值必须经过 Base64 编码 OBS 服务端会将该 MD5 值与对象数据计算出的 MD5 值进行对比, 如果不匹配则上传失败, 返回 HTTP 400 错误 如果不设置对象的 MD5 值,OBS 服务端会忽略对对象数据的 MD5 值校验 文档版本 07 ( ) 版权所有 华为技术有限公司 35

42 5 上传对象 设置对象存储类型 obsclient.putobject({ Key : 'objectname', SourceFile : 'localfile', // 设置对象存储类型为归档存储 StorageClass : ObsClient.enums.StorageClassCold console.error('error-->' + err); 设置对象自定义元数据 使用 StorageClass 参数指定对象的存储类型 如果不设置, 对象的存储类型默认与桶的存储类型保持一致 对象的存储类型分为三类, 其含义与桶存储类型一致 下载归档存储类型的对象前必须将其取回 obsclient.putobject({ Key : 'objectname', SourceFile : 'localfile', Metadata : {'property1':'property-value1', 'property2' : 'property-value2', console.error('error-->' + err); 文档版本 07 ( ) 版权所有 华为技术有限公司 36

43 5 上传对象 使用 Metadata 参数指定对象自定义元数据 在上面设置对象自定义元数据示例代码中, 用户自定义了一个名称为 property1, 值为 property-value1 的元数据和一个名称为 property2, 值为 property-value2 的元数据 一个对象可以有多个元数据, 总大小不能超过 8KB 对象的自定义元数据可以通过 ObsClient.getObjectMetadata 获取, 参见获取对象元数据 使用 ObsClient.getObject 下载对象时, 对象的自定义元数据也会同时下载 5.7 分段上传 对于较大文件上传, 可以切分成段上传 用户可以在如下的应用场景内 ( 但不仅限于此 ), 使用分段上传的模式 : 上传超过 100MB 大小的文件 网络条件较差, 和 OBS 服务端之间的链接经常断开 上传前无法确定将要上传文件的大小 分段上传分为如下 3 个步骤 : 步骤 1 初始化分段上传任务 (ObsClient.initiateMultipartUpload) 步骤 2 逐个或并行上传段 (ObsClient.uploadPart) 步骤 3 合并段 (ObsClient.completeMultipartUpload) 或取消分段上传任务 (ObsClient.abortMultipartUpload) ---- 结束 初始化分段上传任务 使用分段上传方式传输数据前, 必须先通知 OBS 初始化一个分段上传任务 该操作会返回一个 OBS 服务端创建的全局唯一标识 (Upload ID), 用于标识本次分段上传任务 您可以根据这个唯一标识来发起相关的操作, 如取消分段上传任务 列举分段上传任务 列举已上传的段等 您可以通过 ObsClient.initiateMultipartUpload 初始化一个分段上传任务 : obsclient.initiatemultipartupload({ Key : 'objectname', ContentType : 'text/plain', Metadata : {'property' : 'property-value' 文档版本 07 ( ) 版权所有 华为技术有限公司 37

44 5 上传对象 console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('uploadid-->' + result.interfaceresult.uploadid); 初始化分段上传任务时, 除了指定上传对象的名称和所属桶外, 您还可以使用 ContentType 参数和 Metadata 参数分别指定对象 MIME 类型和对象自定义元数据 调用初始化分段上传任务接口成功后, 会返回分段上传任务的全局唯一标识 (Upload ID), 在后面的操作中将用到它 上传段 初始化一个分段上传任务之后, 可以根据指定的对象名和 Upload ID 来分段上传数据 每一个上传的段都有一个标识它的号码 分段号 (Part Number, 范围是 1~10000) 对于同一个 Upload ID, 该分段号不但唯一标识这一段数据, 也标识了这段数据在整个对象内的相对位置 如果您用同一个分段号上传了新的数据, 那么 OBS 上已有的这个段号的数据将被覆盖 除了最后一段以外, 其他段的大小范围是 100KB~5GB; 最后段大小范围是 0~5GB 每个段不需要按顺序上传, 甚至可以在不同进程 不同机器上上传,OBS 会按照分段号排序组成最终对象 您可以通过 ObsClient.uploadPart 上传段 : obsclient.uploadpart({ Bucket:'bucketname', Key:'objectname', // 设置分段号, 范围是 1~10000 PartNumber:1, // 设置 Upload ID UploadId:'upload id from initiatemultipartupload', // 设置将要上传的大文件, 其中 localfile 为待上传的本地文件路径, 需要指定到具体的文件名 SourceFile: 'localfile', // 设置分段大小 PartSize: 5 * 1024 * 1024, // 设置分段的起始偏移大小 Offset: 0 console.log('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('etag-->' + result.interfaceresult.etag); 文档版本 07 ( ) 版权所有 华为技术有限公司 38

45 5 上传对象 使用 PartNumber 参数指定分段号 ; 使用 UploadId 参数指定分段上传任务的全局唯一标识 ; 使用 SourceFile 参数指定待上传的文件 ; 使用 PartSize 参数指定分段大小 ; 使用 Offset 参数指定待上传文件的起始偏移大小 上传段接口要求除最后一段以外, 其他的段大小都要大于 100KB 但是上传段接口并不会立即校验上传段的大小 ( 因为不知道是否为最后一块 ); 只有调用合并段接口时才会校验 OBS 会将服务端收到段数据的 ETag 值 ( 段数据的 MD5 值 ) 返回给用户 可以通过 ContentMD5 参数设置上传数据的 MD5 值, 提供给 OBS 服务端用于校验数据完整性 分段号的范围是 1~10000 如果超出这个范围,OBS 将返回 400 Bad Request 错误 OBS 3.0 的桶支持最小段的大小为 100KB,OBS 2.0 的桶支持最小段的大小为 5MB 请在 OBS 3.0 的桶上执行分段上传操作 合并段 所有分段上传完成后, 需要调用合并段接口来在 OBS 服务端生成最终对象 在执行该操作时, 需要提供所有有效的分段列表 ( 包括分段号和分段 ETag 值 );OBS 收到提交的分段列表后, 会逐一验证每个段的有效性 当所有段验证通过后,OBS 将把这些分段组合成最终的对象 您可以通过 ObsClient.completeMultipartUpload 合并段 : obsclient.completemultipartupload({ Bucket:'bucketname', Key:'objectname', // 设置 Upload ID UploadId:'upload id from initiatemultipartupload', Parts: [{'PartNumber':1,'ETag':'etag value from uploadpart'] console.log('error-->' + err); 使用 UploadId 参数指定分段上传任务的全局唯一标识 ; 使用 Parts 参数指定分段号与分段 ETag 值的列表, 该列表必须按分段号升序排列 分段可以是不连续的 并发分段上传 分段上传的主要目的是解决大文件上传或网络条件较差的情况 下面的示例代码展示了如何使用分段上传并发上传大文件 : 文档版本 07 ( ) 版权所有 华为技术有限公司 39

46 5 上传对象 // 初始化分段上传任务 obsclient.initiatemultipartupload({ Key : 'objectname' if(!err && result.commonmsg.status < 300){ var uploadid = result.interfaceresult.uploadid; console.log('\t' + uploadid + '\n'); // 每段上传 100MB var partsize = 100 * 1024 * 1024; var fs = require('fs'); var samplefilepath = 'localfile'; var filelength = fs.lstatsync(samplefilepath).size; // 计算需要上传的段数 var partcount = filelength % partsize === 0? Math.floor(fileLength / partsize) : Math.floor(fileLength / partsize) + 1; var events = require('events'); var eventemitter = new events.eventemitter(); var parts = []; // 指定并发上传 for(let i=0;i<partcount;i++){ // 分段在文件中的起始位置 let offset = i * partsize; // 分段大小 let currpartsize = (i + 1 === partcount)? filelength - offset : partsize; // 分段号 let partnumber = i + 1; obsclient.uploadpart({ Key: 'objectname', PartNumber: partnumber, UploadId : uploadid, SourceFile: samplefilepath, Offset : offset, PartSize : currpartsize if(!err && result.commonmsg.status < 300){ parts.push({partnumber : partnumber, ETag : result.interfaceresult.etag if(parts.length === partcount){ // 按分段号排序 var _parts = parts.sort((a, b) => { if(a.partnumber >= b.partnumber){ return 1; return -1; eventemitter.emit('upload part finished', _parts); throw new Error(err result.commonmsg.code); 文档版本 07 ( ) 版权所有 华为技术有限公司 40

47 5 上传对象 // 等待上传完成 eventemitter.on('upload part finished', (parts) => { // 合并段 obsclient.completemultipartupload({ Key: 'objectname', UploadId: uploadid, Parts: parts console.log('error-->' + err); 大文件分段上传时, 使用 Offset 参数和 PartSize 参数配合指定每段数据在文件中的起始结束位置 取消分段上传任务 分段上传任务可以被取消, 当一个分段上传任务被取消后, 就不能再使用其 Upload ID 做任何操作, 已经上传段也会被 OBS 删除 采用分段上传方式上传对象过程中或上传对象失败后会在桶内产生段, 这些段会占用您的存储空间, 您可以通过取消该分段上传任务来清理掉不需要的段, 节约存储空间 您可以通过 ObsClient.abortMultipartUpload 取消分段上传任务 : obsclient.abortmultipartupload({ Bucket:'bucketname', Key:'objectname', // 设置 Upload ID UploadId:'upload id from initiatemultipartupload', console.log('error-->' + err); 文档版本 07 ( ) 版权所有 华为技术有限公司 41

48 5 上传对象 列举已上传的段 您可使用 ObsClient.listParts 列举出某一分段上传任务所有已经上传成功的段 该接口可设置的参数如下 : 参数 UploadId MaxParts PartNumberMarker 作用 分段上传任务全局唯一标识, 从 ObsClient.initiateMultipartUpload 返回的结果获取 表示列举已上传段的返回结果最大段数目, 即分页时每一页中段数目 表示列举已上传段的起始位置, 只有 Part Number 大于该参数的段会被列出 简单列举 // 列举已上传的段, 其中 uploadid 来自于 initiatemultipartupload obsclient.listparts({ Key: 'objectname', UploadId : 'upload id from initiatemultipartupload' console.log('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ for(let i=0;i<result.interfaceresult.parts.length;i++){ console.log('part['+ i +']:'); // 分段号, 上传时候指定 console.log('partnumber-->' + result.interfaceresult.parts[i] ['PartNumber']); // 段的最后上传时间 console.log('lastmodified-->' + result.interfaceresult.parts[i] ['LastModified']); // 分段的 ETag 值 console.log('etag-->' + result.interfaceresult.parts[i]['etag']); // 段数据大小 console.log('size-->' + result.interfaceresult.parts[i]['size']); 文档版本 07 ( ) 版权所有 华为技术有限公司 42

49 5 上传对象 列举段至多返回 1000 个段信息, 如果指定的 Upload ID 包含的段数量大于 1000, 则返回结果中 InterfaceResult.IsTruncated 为 true 表明本次没有返回全部段, 并可通过 InterfaceResult.NextPartNumberMarker 获取下次列举的起始位置 如果想获取指定 Upload ID 包含的所有分段, 可以采用分页列举的方式 列举所有段 由于 ObsClient.listParts 只能列举至多 1000 个段, 如果段数量大于 1000, 列举所有分段请参考如下示例 : var listall = (partnumbermarker) => { // 列举已上传的段, 其中 uploadid 来自于 initiatemultipartupload obsclient.listparts({ Key: 'objectname', UploadId : 'upload id from initiatemultipartupload', PartNumberMarker : partnumbermarker console.log('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ for(let i=0;i<result.interfaceresult.parts.length;i++){ console.log('part['+ i +']:'); // 分段号, 上传时候指定 console.log('partnumber-->' + result.interfaceresult.parts[i] ['PartNumber']); // 段的最后上传时间 console.log('lastmodified-->' + result.interfaceresult.parts[i] ['LastModified']); // 分段的 ETag 值 console.log('etag-->' + result.interfaceresult.parts[i]['etag']); // 段数据大小 console.log('size-->' + result.interfaceresult.parts[i]['size']); if(result.interfaceresult.istruncated === 'true'){ listall(result.interfaceresult.nextpartnumbermarker); ; listall(); 列举分段上传任务 您可以通过 ObsClient.listMultipartUploads 列举分段上传任务 列举分段上传任务可设置的参数如下 : 文档版本 07 ( ) 版权所有 华为技术有限公司 43

50 5 上传对象 参数 Prefix Delimiter MaxUploads KeyMarker UploadIdMarker 作用 限定返回的分段上传任务中的对象名必须带有 Prefix 前缀 用于对分段上传任务中的对象名进行分组的字符 对于对象名中包含 Delimiter 的任务, 其对象名 ( 如果请求中指定了 Prefix, 则此处的对象名需要去掉 Prefix) 中从首字符至第一个 Delimiter 之间的字符串将作为一个分组并作为 CommonPrefix 返回 列举分段上传任务的最大数目, 取值范围为 1~1000, 当超出范围时, 按照默认的 1000 进行处理 表示列举时返回指定的 KeyMarker 之后的分段上传任务 只有与 KeyMarker 参数一起使用时才有意义, 用于指定返回结果的起始位置, 即列举时返回指定 KeyMarker 的 UploadIdMarker 之后的分段上传任务 简单列举分段上传任务 obsclient.listmultipartuploads({ Bucket : 'bucketname' console.log('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ for(let i=0;i<result.interfaceresult.uploads.length;i++){ console.log('uploads[' + i + ']'); console.log('uploadid-->' + result.interfaceresult.uploads[i] ['UploadId']); console.log('key-->' + result.interfaceresult.uploads[i]['key']); console.log('initiated-->' + result.interfaceresult.uploads[i] ['Initiated']); 列举分段上传任务至多返回 1000 个任务信息, 如果指定的桶包含的分段上传任务数量大于 1000, 则返回结果中 InterfaceResult.IsTruncated 为 true 表明本次没有返回全部结果, 并可通过 InterfaceResult.NextKeyMarker 和 InterfaceResult.NextUploadIdMarker 获取下次列举的起点 如果想获取指定桶包含的所有分段上传任务, 可以采用分页列举的方式 列举全部分段上传任务 文档版本 07 ( ) 版权所有 华为技术有限公司 44

51 5 上传对象 var listall = (keymarker, uploadidmarker) => { obsclient.listmultipartuploads({ KeyMarker : keymarker, UploadIdMarker : uploadidmarker console.log('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ for(let i=0;i<result.interfaceresult.uploads.length;i++){ console.log('uploads[' + i + ']'); console.log('uploadid-->' + result.interfaceresult.uploads[i] ['UploadId']); console.log('key-->' + result.interfaceresult.uploads[i]['key']); console.log('initiated-->' + result.interfaceresult.uploads[i] ['Initiated']); if(result.interfaceresult.istruncated === 'true'){ listall(result.interfaceresult.nextkeymarker, result.interfaceresult.nextuploadidmarker); listall(); 5.8 设置对象生命周期 上传对象或者初始化分段上传任务时, 您可以直接指定对象的过期时间 示例代码如下 : // 上传对象时, 设置对象 30 天后过期 obsclient.putobject({ Key : 'objectname', Body : 'Hello OBS', Expires : 30 文档版本 07 ( ) 版权所有 华为技术有限公司 45

52 5 上传对象 console.error('error-->' + err); // 初始化分段上传任务时, 设置合并段后生成的对象 60 天后过期 obsclient.initiatemultipartupload({ Key : 'objectname', ContentType : 'text/plain', Expires : 60 console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('uploadid-->' + result.interfaceresult.uploadid); 使用 Expires 参数指定对象的过期时间 上述方式仅支持设置以天为单位的对象过期时间, 过期后的对象会被 OBS 服务端自动清理 上述方式设置的对象过期时间, 其优先级高于桶生命周期规则 5.9 追加上传 追加上传可实现对同一个对象追加数据内容的功能 您可以通过 ObsClient.appendObject 进行追加上传 示例代码如下 : // 第一次追加上传, 起始位置必须为 0 obsclient.appendobject({ Bucket:'bucketname', Key:'objectname', Position : 0, Body : 'Hello OBS' ).then(function(result){ if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('nextposition-->' + result.interfaceresult.nextposition); // 第二次追加上传 obsclient.appendobject({ Bucket:'bucketname', Key:'objectname', Position : result.interfaceresult.nextposition, Body : 'Hello OBS Again', function(err, result2){ 文档版本 07 ( ) 版权所有 华为技术有限公司 46

53 5 上传对象 console.error('error-->' + err); console.log('status-->' + result2.commonmsg.status); if(result2.commonmsg.status < 300 && result2.interfaceresult){ console.log('nextposition-->' + result2.interfaceresult.nextposition); // 通过获取对象属性接口获取下次追加上传的位置 obsclient.getobjectmetadata({ Bucket:'bucketname', Key:'objectname', ).then(function(result3){ console.log('status-->' + result3.commonmsg.status); if(result3.commonmsg.status < 300 && result3.interfaceresult){ console.log('requestid-->' + result3.interfaceresult.requestid); console.log('nextposition-->' + result3.interfaceresult.nextposition); ).catch(function(err){ console.error('err:' + err); ).catch(function(err){ console.error('err:' + err); 使用 Position 参数指定追加上传的位置, 且第一次追加上传的位置必须为 0 ObsClient.putObject 上传的对象可覆盖 ObsClient.appendObject 上传的对象, 覆盖后对象变为普通对象, 不可再进行追加上传 第一次调用追加上传时, 若已存在同名的普通对象, 则会抛出异常 (HTTP 状态码为 409) 追加上传返回的 ETag 是当次追加数据内容的 ETag, 不是完整对象的 ETag 单次追加上传的内容不能超过 5GB, 且最多支持 次追加上传 追加上传成功后, 可通过返回结果中 InterfaceResult.NextPosition 获取下次追加上传的位置 ; 或者通过 ObsClient.getObjectMetadata 接口获取下次追加上传的位置 5.10 分段复制 分段复制是分段上传的一种特殊情况, 即分段上传任务中的段通过复制 OBS 指定桶中现有对象 ( 或对象的一部分 ) 来实现 您可以通过 ObsClient.copyPart 来复制段 以下代码展示了如何使用分段复制模式复制大对象 : var destbucketname = 'destbucketname'; var destobjectkey = 'destobjectname'; var sourcebucketname = 'sourcebucketname'; var sourceobjectkey = 'sourceobjectname'; // 初始化分段上传任务 obsclient.initiatemultipartupload({ 文档版本 07 ( ) 版权所有 华为技术有限公司 47

54 5 上传对象 Bucket : destbucketname, Key : destobjectkey if(!err && result.commonmsg.status < 300){ var uploadid = result.interfaceresult.uploadid; console.log('\t' + uploadid + '\n'); // 获取大对象信息 obsclient.getobjectmetadata({ Bucket : sourcebucketname, Key : sourceobjectkey if(!err && result.commonmsg.status < 300){ // 每段复制 100MB var partsize = 100 * 1024 * 1024; var objectsize = Number(result.InterfaceResult.ContentLength); // 计算需要复制的段数 var partcount = objectsize % partsize === 0? Math.floor(objectSize / partsize) : Math.floor(objectSize / partsize) + 1; var events = require('events'); var eventemitter = new events.eventemitter(); var parts = []; // 执行并发复制段 for(let i=0;i<partcount;i++){ let rangestart = i * partsize; let rangeend = (i + 1) === partcount? objectsize - 1 : rangestart + partsize - 1; let partnumber = i + 1; obsclient.copypart({ Bucket: destbucketname, Key: destobjectkey, PartNumber : partnumber, UploadId : uploadid, CopySource: sourcebucketname + '/' + sourceobjectkey, CopySourceRange : 'bytes=' + rangestart + '-' + rangeend if(!err && result.commonmsg.status < 300){ parts.push({partnumber : partnumber, ETag : result.interfaceresult.etag if(parts.length === partcount){ var _parts = parts.sort((a, b) => { if(a.partnumber >= b.partnumber){ return 1; return -1; eventemitter.emit('copy part finished', _parts); throw new Error(err result.commonmsg.code); // 等待复制完成 eventemitter.on('copy part finished', (parts) => { // 合并段 obsclient.completemultipartupload({ Bucket: destbucketname, Key: destobjectkey, UploadId: uploadid, Parts: parts if(!err && result.commonmsg.status < 300){ console.log('complete to upload multiparts 文档版本 07 ( ) 版权所有 华为技术有限公司 48

55 5 上传对象 finished.\n'); 复制段时, 使用 PartNumber 参数指定分段号 ; 使用 UploadId 参数指定分段上传任务的全局唯一标识 ; 使用 CopySource 参数指定复制时的源对象信息 ; 使用 CopySourceRange 参数指定待复制的源对象的字节范围 5.11 断点续传上传 当上传大文件时, 经常出现因网络不稳定或程序崩溃导致上传失败的情况 失败后再次重新上传不仅浪费资源, 而且当网络不稳定时仍然有上传失败的风险 断点续传上传接口能有效地解决此类问题引起的上传失败, 其原理是将待上传的文件分成若干个分段分别上传, 并实时地将每段上传结果统一记录在 checkpoint 文件中, 仅当所有分段都上传成功时返回上传成功的结果, 否则在回调函数中返回错误码提醒用户再次调用接口进行重新上传 ( 重新上传时因为有 checkpoint 文件记录当前的上传进度, 避免重新上传所有分段, 从而节省资源提高效率 ) 您可以通过 ObsClient.uploadFile 进行断点续传上传 该接口可设置的主要参数如下 : 参数 Bucket Key UploadFile PartSize 作用 桶名, 必选参数 对象名, 必选参数 待上传的本地文件, 必选参数 分段大小, 单位字节, 取值范围是 100KB~5GB, 默认为 5MB TaskNum 分段上传时的最大并发数, 默认为 20 EnableCheckpoint CheckpointFile EnableCheckSum 是否开启断点续传模式, 默认为 false, 表示不开启 记录上传进度的文件, 只在断点续传模式下有效 当该值为空时, 默认与待上传的本地文件同目录 是否校验待上传文件的内容, 只在断点续传模式下有效 默认为 false, 表示不校验 以下代码展示了如何使用断点续传上传接口上传文件 : 文档版本 07 ( ) 版权所有 华为技术有限公司 49

56 5 上传对象 access_key_id : '*** Provide your Access Key ***', secret_access_key : '*** Provide your Secret Key ***', obsclient.uploadfile({ Key : 'objectname', // 设置待上传的本地文件,localfile 为待上传的本地文件路径, 需要指定到具体的文件名 UploadFile : 'localfile', // 设置分段大小为 10MB PartSize : 10 * 1024 * 1024, // 开启断点续传模式 EnableCheckpoint : true console.error('error-->' + err); console.log('requestid-->' + result.interfaceresult.requestid); console.log('bucket-->' + result.interfaceresult.bucket); console.log('key-->' + result.interfaceresult.key); console.log('location-->' + result.interfaceresult.location); 断点续传上传接口是利用分段上传特性实现的, 是对分段上传的封装和加强 断点续传上传接口不仅能在失败重传时节省资源提高效率, 还因其对分段进行并发上传的机制能加快上传速度, 能帮助用户快速完成上传业务 ; 且其对用户透明, 用户不用关心 checkpoint 文件的创建和删除 分段任务的切分 并发上传的实现等内部细节 EnableCheckpoint 参数默认是 false, 代表不启用断点续传模式, 此时断点续传上传接口退化成对分段上传的简单封装, 不会产生 checkpoint 文件 CheckpointFile 参数和 EnableCheckSum 参数仅在 EnableCheckpoint 参数为 true 时有效 5.12 基于表单上传 基于表单上传是使用 HTML 表单形式上传对象到指定桶中, 对象最大不能超过 5GB 您可以通过 ObsClient.createPostSignatureSync 生成基于表单上传的请求参数 使用 Node.js 代码模拟表单上传的完整代码示例, 参见 post-object-sample 您也可以通过如下步骤进行表单上传 : 步骤 1 步骤 2 步骤 3 步骤 4 使用 ObsClient.createPostSignatureSync 生成用于鉴权的请求参数 准备表单 HTML 页面 将生成的请求参数填入 HTML 页面 选择本地文件, 进行表单上传 ---- 结束 使用 SDK 生成用于鉴权的请求参数包括两个 : Policy, 对应表单中 policy 字段 Signature, 对应表单中的 signature 字段 以下代码展示了如何生成基于表单上传的请求参数 : 文档版本 07 ( ) 版权所有 华为技术有限公司 50

57 5 上传对象 server : ' signature : 'obs' // 设置表单参数 var formparams = { // 设置对象访问权限为公共读 'x-obs-acl': obsclient.enums.aclpublicread, // 设置对象 MIME 类型 'content-type': 'text/plain', ; // 设置表单上传请求有效期, 单位 : 秒 var expires = 3600; var res = obsclient.createpostsignaturesync({expires:expires, FormParams: formparams // 获取表单上传请求参数 console.log('\t' + res.policy); console.log('\t' + res.signature); 示例表单 HTML 代码如下 : <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <form action=" method="post" enctype="multipart/form-data"> Object key <!-- 对象名 --> <input type="text" name="key" value="objectname" /> <p> ACL <!-- 对象 ACL 权限 --> <input type="text" name="x-obs-acl" value="public-read" /> <p> Content-Type <!-- 对象 MIME 类型 --> <input type="text" name="content-type" value="text/plain" /> <p> <!-- policy 的 base64 编码值 --> <input type="hidden" name="policy" value="*** Provide your policy ***" /> <!-- AK --> <input type="hidden" name="accesskeyid" value="*** Provide your access key ***"/> <!-- 签名串信息 --> <input type="hidden" name="signature" value="*** Provide your signature ***"/> <input name="file" type="file" /> <input name="submit" value="upload" type="submit" /> </form> </body> </html> HTML 表单中的 policy,signature 的值均是从 ObsClient.createPostSignatureSync 的返回结果中获取 您可以直接下载表单 HTML 示例 PostDemo 文档版本 07 ( ) 版权所有 华为技术有限公司 51

58 6 下载对象 6 下载对象 6.1 对象下载简介 OBS Node.js SDK 提供了丰富的对象下载接口, 可以通过以下方式下载对象 : 6.2 文本下载 6.3 流式下载 6.4 文件下载 6.5 范围下载 6.10 断点续传下载您可以通过 ObsClient.getObject 下载对象 6.2 文本下载 以下代码展示了如何进行文本下载 : obsclient.getobject({ Key : 'objectname' console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ // 读取对象内容 console.log('object Content:'); 文档版本 07 ( ) 版权所有 华为技术有限公司 52

59 6 下载对象 console.log(result.interfaceresult.content.tostring()); 文本下载方式下返回结果中的 InterfaceResult.Content 是一个 Buffer 对象 6.3 流式下载 以下代码展示了如何进行流式下载 : obsclient.getobject({ Key : 'objectname', SaveAsStream : true console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ // 读取对象内容 console.log('object Content:\n'); result.interfaceresult.content.on('data', (data) => { console.log(data.tostring()); 使用 SaveAsStream 参数指定使用流式下载 InterfaceResult.Content 是 stream.readable 的实例, 可将对象的内容读取到本地文件或者内存中 6.4 文件下载 以下代码展示了如何进行文件下载 : 文档版本 07 ( ) 版权所有 华为技术有限公司 53

60 6 下载对象 obsclient.getobject({ Key : 'objectname', SaveAsFile : 'localfile' console.error('error-->' + err); 使用 SaveAsFile 参数指定文件下载的路径 6.5 范围下载 如果只需要下载对象的其中一部分数据, 可以使用范围下载, 下载指定范围的数据 如果指定的下载范围是 0~1000, 则返回第 0 到第 1000 个字节的数据, 包括第 1000 个, 共 1001 字节的数据, 即 [0,1000] 如果指定的范围无效, 则返回整个对象的数据 以下代码展示了如何进行范围下载 : obsclient.getobject({ Key : 'objectname', // 指定下载范围 Range : 'bytes=0-1000' console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ // 读取对象内容 console.log('object Content:'); console.log(result.interfaceresult.content.tostring()); 使用 Range 参数指定下载范围, 格式为 bytes=x-y 如果指定的范围无效 ( 比如开始位置 结束位置为负数, 大于文件大小 ), 则会返回整个对象 可以利用范围下载并发下载大对象, 详细代码示例请参考 concurrent-download-objectsample 文档版本 07 ( ) 版权所有 华为技术有限公司 54

61 6 下载对象 6.6 限定条件下载 下载对象时, 可以指定一个或多个限定条件, 满足限定条件时则进行下载, 否则返回异常码, 下载对象失败 您可以使用的限定条件如下 : 参数作用格式 IfModifiedSince IfUnmodifiedSince IfMatch 如果对象的修改时间晚于该参数值指定的时间, 则返回对象内容, 否则返回异常码 如果对象的修改时间早于该参数值指定的时间, 则返回对象内容, 否则返回异常码 如果对象的 ETag 值与该参数值相同, 则返回对象内容, 否则返回异常码 符合 rfc2616.txt 规定格式的 HTTP 时间字符串 符合 rfc2616.txt 规定格式的 HTTP 时间字符串 字符串 IfNoneMatch 如果对象的 ETag 值与该参数值不相同, 则返回对象内容, 否则返回异常码 字符串 对象的 ETag 值是指对象数据内容的 MD5 校验值 如果包含 IfUnmodifiedSince 并且不符合或者包含 IfMatch 并且不符合, 则下载对象失败, 返回异常码 :412 precondition failed 如果包含 IfModifiedSince 并且不符合或者包含 IfNoneMatch 并且不符合, 则下载对象失败, 返回异常码 :304 Not Modified 以下代码展示了如何进行限定条件下载 : obsclient.getobject({ Key : 'objectname', IfModifiedSince : 'Wed, 04 Jul :54:53 GMT' 文档版本 07 ( ) 版权所有 华为技术有限公司 55

62 6 下载对象 console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ // 读取对象内容 console.log('object Content:'); console.log(result.interfaceresult.content.tostring()); 6.7 重写响应头 下载对象时, 可以重写部分 HTTP/HTTPS 响应头信息 可重写的响应头信息见下表 : 参数 ResponseContentType ResponseContentLanguage ResponseExpires ResponseCacheControl ResponseContentDisposition ResponseContentEncoding 作用重写 HTTP/HTTPS 响应中的 Content-Type 重写 HTTP/HTTPS 响应中的 Content-Language 重写 HTTP/HTTPS 响应中的 Expires 重写 HTTP/HTTPS 响应中的 Cache-Control 重写 HTTP/HTTPS 响应中的 Content-Disposition 重写 HTTP/HTTPS 响应中的 Content-Encoding 以下代码展示了如何重写响应头 : obsclient.getobject({ Key : 'objectname', ResponseContentType : 'image/jpeg' console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ // 获取重写后的响应头 console.log(result.interfaceresult.contenttype); 文档版本 07 ( ) 版权所有 华为技术有限公司 56

63 6 下载对象 6.8 获取自定义元数据 下载对象成功后会返回对象的自定义元数据 以下代码展示了如何获取自定义元数据 : // 下载对象, 获取对象自定义元数据 obsclient.getobject({ Key : 'objectname', console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ console.log('metadata-->' + JSON.stringify(result.InterfaceResult.Metadata['property'])); 6.9 下载归档存储对象 如果要下载归档存储对象, 需要先将归档存储对象取回 取回归档存储对象的取回选项可支持两类, 见下表 : 选项 OBS Node.js SDK 对应值 快速取回 取回耗时 1~5 分钟 ObsClient.enums.RestoreTie rexpedited 标准取回 取回耗时 3~5 小时 默认值 ObsClient.enums.RestoreTie rstandard 您可以通过 ObsClient.restoreObject 取回归档存储对象 以下代码展示了如何下载归档存储对象 : 文档版本 07 ( ) 版权所有 华为技术有限公司 57

64 6 下载对象 // 取回归档存储对象 obsclient.restoreobject({ Key : 'objectname', Days : 1, Tier : obsclient.enums.restoretierexpedited console.error('error-->' + err); // 等待对象取回 settimeout(()=>{ // 下载对象, 获取对象内容 obsclient.getobject({ Key : 'objectname' console.error('error-->' + err); if(result.commonmsg.status < 300 && result.interfaceresult){ // 读取对象内容 console.log('object Content:'); console.log(result.interfaceresult.content.tostring());, 6 * 60 * 1000); ObsClient.restoreObject 中指定的对象必须是归档存储类型, 否则调用该接口会报错 使用 Days 参数指定取回对象保存的时间, 取值范围是 1~30; 使用 Tier 参数指定取回选项, 表示取回对象所耗的时间 6.10 断点续传下载 当下载大对象到本地文件时, 经常出现因网络不稳定或程序崩溃导致下载失败的情况 失败后再次重新下载不仅浪费资源, 而且当网络不稳定时仍然有下载失败的风险 断点续传下载接口能有效地解决此类问题引起的下载失败, 其原理是将待下载的对象分成若干个分段分别下载, 并实时地将每段下载结果统一记录在 checkpoint 文件中, 仅当所有分段都下载成功时返回下载成功的结果, 否则在回调函数中返回错误码提醒用户再次调用接口进行重新下载 ( 重新下载时因为有 checkpoint 文件记录当前的下载进度, 避免重新下载所有分段, 从而节省资源提高效率 ) 您可以通过 ObsClient.downloadFile 进行断点续传下载 该接口可设置的主要参数如下 : 参数 Bucket 作用 桶名, 必选参数 文档版本 07 ( ) 版权所有 华为技术有限公司 58

65 6 下载对象 参数 Key DownloadFile PartSize 作用 对象名, 必选参数 下载对象的本地文件全路径 当该值为空时, 默认为当前程序的运行目录 分段大小, 单位字节, 取值范围是 100KB~5GB, 默认为 5MB TaskNum 分段下载时的最大并发数, 默认为 20 EnableCheckpoint CheckpointFile VersionId IfModifiedSince IfUnmodifiedSince IfMatch IfNoneMatch 是否开启断点续传模式, 默认为 false, 表示不开启 记录下载进度的文件, 只在断点续传模式下有效 当该值为空时, 默认与下载对象的本地文件路径同目录 对象的版本号 如果对象的修改时间晚于该参数值指定的时间, 则返回对象内容, 否则返回异常码 如果对象的修改时间早于该参数值指定的时间, 则返回对象内容, 否则返回异常码 如果对象的 ETag 值与该参数值相同, 则返回对象内容, 否则返回异常码 如果对象的 ETag 值与该参数值不相同, 则返回对象内容, 否则返回异常码 以下代码展示了如何使用断点续传下载接口下载对象到本地文件 : access_key_id : '*** Provide your Access Key ***', secret_access_key : '*** Provide your Secret Key ***', obsclient.downloadfile({ Key : 'objectname', // 设置下载对象的本地文件路径 DownloadFile : 'localfile', // 设置分段大小为 10MB PartSize : 10 * 1024 * 1024, // 开启断点续传模式 EnableCheckpoint : true console.error('error-->' + err); console.log('requestid-->' + result.interfaceresult.requestid); console.log('lastmodified-->' + result.interfaceresult.lastmodified); console.log('metadata-->' + JSON.stringify(result.InterfaceResult.Metadata)); 文档版本 07 ( ) 版权所有 华为技术有限公司 59

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

C SDK开发指南

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

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参考

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

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

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

云数据库 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 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 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

开发指南

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

More information

产品介绍

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

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

注意 : 请不要用生产 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

API参考

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

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

More information

MASQUERADE # iptables -t nat -A POSTROUTING -s / o eth0 -j # sysctl net.ipv4.ip_forward=1 # iptables -P FORWARD DROP #

MASQUERADE # iptables -t nat -A POSTROUTING -s / o eth0 -j # sysctl net.ipv4.ip_forward=1 # iptables -P FORWARD DROP # iptables 默认安全规则脚本 一 #nat 路由器 ( 一 ) 允许路由 # iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT ( 二 ) DNAT 与端口转发 1 启用 DNAT 转发 # iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 dprot 422 -j DNAT to-destination

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

友普云对象存储操作手册 友普云对象存储操作手册 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

停止混流接口 请注意 : 该功能需要联系 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

手册 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

本章学习目标 小风 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

客户端指南(OBS Browser)

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

More information

工具指南

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

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

Guava学习之Resources

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

More information

RPC SOAP REST API API HTTP JSON XML PHP PHP PHP PHP PHP HTTP request/response cycle HTTP HTTP verbs headers Cookies JSON XML PHP RPC SOAP RESTful HTTP

RPC SOAP REST API API HTTP JSON XML PHP PHP PHP PHP PHP HTTP request/response cycle HTTP HTTP verbs headers Cookies JSON XML PHP RPC SOAP RESTful HTTP RPC SOAP REST API API HTTP JSON XML PHP PHP PHP PHP PHP HTTP request/response cycle HTTP HTTP verbs headers Cookies JSON XML PHP RPC SOAP RESTful HTTP API API 前言 vii 第一章 HTTP HTTP HyperText Transfer Protocol

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

用户指南

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

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

常见问题

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

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

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

《linux从入门到精通》实验指导第三讲:文件及目录操作

《linux从入门到精通》实验指导第三讲:文件及目录操作 Web 交互开发 实验教学指导 实验六 : 文件 一 实验目的 (5 分 ) 1 掌握文件处理对象的相关操作; 2 了解文件打印的方法; 3 掌握 FileSystem API 的基本概念以及相关属性 方法与事件 ; 4 掌握 FileReader API 读取文件的内容的方法 ; 二 实验环境 (5 分 ) 1 Windows XP/Windows 7 操作系统的计算机 ; 2 局域网网络环境,

More information

京东云存储开发者文档

京东云存储开发者文档 更新时间 更新内容 2013/05/21 创建文档 2013/07/10 增加分块上传 API 的内容 2013/07/12 增加桶和对象 API 的内容 目录 京东云存储开发者文档... 1 目录... 2 一 前言... 4 二 介绍... 5 三 相关概念... 6 3.1 AccessKey 与 SecretKey... 6 3.2 Bucket... 6 3.2.1 限制... 6 3.3

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

RUN_PC連載_10_.doc

RUN_PC連載_10_.doc PowerBuilder 8 (10) Jaguar CTS ASP Jaguar CTS PowerDynamo Jaguar CTS Microsoft ASP (Active Server Pages) ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar Server ASP

More information

WebEx 一键集成 1 文档目的 Web 集成 URL API 语法 启会 加会 调用 移动集成 wbx schema 调用 取得 sessionticket...4

WebEx 一键集成 1 文档目的 Web 集成 URL API 语法 启会 加会 调用 移动集成 wbx schema 调用 取得 sessionticket...4 WebEx 一键集成 1 文档目的...1 2 Web 集成...1 2.1 URL API 语法...1 2.2 启会...2 2.3 加会...3 2.4 调用...3 3 移动集成...3 3.1 wbx schema...3 3.2 调用...4 4 取得 sessionticket...4 1 文档目的 本文档目的是, 让用户了解如何在 Web 端和移动端, 一键调用 WebEx app,

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

一 登录 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

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) 09 (File Processes) 9-1 9-2 (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) Java Servlet 9-1 Servlet (File Processes) Client Servlet Servlet Java Java (Stream)

More information

又拍 UpYun 云存储百度编辑器 UEditor 集成工具 安装使用手册 v

又拍 UpYun 云存储百度编辑器 UEditor 集成工具 安装使用手册 v 又拍 UpYun 云存储百度编辑器 UEditor 集成工具 安装使用手册 v0.2 2013.01 目录 一 使用须知 :... 3 二 安装说明 :... 4 三 联系我们 :... 6 附一 : 百度编辑器 UEditor 完整版部署与体验 :... 7 附二 此集成工具所做的一些修改 :... 9 杭州纬聚网络有限公司 2 / 11 一 使用须知 : 已经安装部署百度编辑器 UEditor

More information

目录 1 IPv6 PIM Snooping 配置命令 IPv6 PIM Snooping 配置命令 display pim-snooping ipv6 neighbor display pim-snooping ipv6 routing-ta

目录 1 IPv6 PIM Snooping 配置命令 IPv6 PIM Snooping 配置命令 display pim-snooping ipv6 neighbor display pim-snooping ipv6 routing-ta 目录 1 IPv6 PIM Snooping 配置命令 1-1 1.1 IPv6 PIM Snooping 配置命令 1-1 1.1.1 display pim-snooping ipv6 neighbor 1-1 1.1.2 display pim-snooping ipv6 routing-table 1-2 1.1.3 display pim-snooping ipv6 statistics

More information

技 术 文 件

技  术  文  件 技术文件 技术文件名称 :IAlert 接口使用说明 技术文件编号 : 版 本 :V1.0 共页 ( 包括封面 ) 拟制 审核 会签 标准化 批准 中兴通讯股份有限公司 XX 软件模块详细设计说明 版本号 修改记录 文件编号 版本号 拟制人 / 修改人 拟制 / 修改日期 1 V1.0 胡曦 2005-08-12 新建 更改理由 主要更改内容 ( 写要点即可 ) 注 1: 每次更改归档文件 ( 指归档到事业部或公司档案室的文件

More information

对象存储 OSS/SDK 手册 SDK 手册 Java-SDK 前言 SDK 下载 Java SDK 开发包最新版本 2.2.1:java_sdk_ zip; github 地址 : 版本迭代详

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

More information

客户端指南(obscmd)

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

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

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

快速入门

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

More information

untitled

untitled PowerBuilder Tips 利 PB11 Web Service 年度 2 PB Tips PB9 EAServer 5 web service PB9 EAServer 5 了 便 web service 來說 PB9 web service 力 9 PB11 release PB11 web service 力更 令.NET web service PB NVO 論 不 PB 來說 說

More information

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

获取 Access Token 1 基础概念 access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要妥善保存,access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新 获取 Access Token 1 基础概念 access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要妥善保存,access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新 接入方可以使用 app_id 和 server_app_secret 调用本接口来获取 access_token

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 友乾营 报表的 SQL 植入风险 规避风险 : 让你的报表变的安全起来 SQL 植入的概念 恶意的 SQL 归根结底 : 执行了不该允许执行的 SQL 命令, 达到非法的目的 常见案例 骗过登录验证非法获取账号信息篡改 删除数据 为什么存在 SQL 植入 植入原理 如何攻击 特殊的输入参数 未处理特殊字符 -- # 数据库配置不合理 植入原理 : 案例 1, 特殊输入参数 union or 猜表名

More information

epub 61-2

epub 61-2 2 Web Dreamweaver UltraDev Dreamweaver 3 We b We b We Dreamweaver UltraDev We b Dreamweaver UltraDev We b We b 2.1 Web We b We b D r e a m w e a v e r J a v a S c r i p t We b We b 2.1.1 Web We b C C +

More information

07-form

07-form PHP 的输 入 表单与 文件上传杨亮 Web 基本流程 请求 页 面 对应 文件 获取数据 PC Mobile HTTP 请求 html css javascript 服务器 (Apache) (IIS) html css javascript 后端脚本 (PHP) (JSP) (ASP) 数据库 (MySQL) (Oracle) (Access) 返回 页 面 返回 页 面 返回数据 客户端 服务器端

More information

ext-web-auth-wlc.pdf

ext-web-auth-wlc.pdf 使 用 无 线 局 域 网 控 制 器 的 外 部 Web 身 份 验 证 配 置 示 例 目 录 简 介 先 决 条 件 要 求 使 用 的 组 件 规 则 背 景 信 息 外 部 Web 身 份 验 证 过 程 网 络 设 置 配 置 为 来 宾 用 户 创 建 动 态 接 口 创 建 预 先 身 份 验 证 ACL 在 WLC 上 为 来 宾 用 户 创 建 本 地 数 据 库 配 置 外 部

More information

Microsoft Word - PHP7Ch01.docx

Microsoft Word - PHP7Ch01.docx PHP 01 1-6 PHP PHP HTML HTML PHP CSSJavaScript PHP PHP 1-6-1 PHP HTML PHP HTML 1. Notepad++ \ch01\hello.php 01: 02: 03: 04: 05: PHP 06:

More information

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes 包管理理 工具 Helm 蔺礼强 Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Microsoft Word - AccessPortal使用手册v3.1.doc

Microsoft Word - AccessPortal使用手册v3.1.doc HighGuard Access Portal 使用手册 地址 : 上海市张江高科技园区松涛路 563 号海外创新园 B 座 301-302 室 电话 : 021-50806229 传真 : 021-50808180 电子邮件 : marketing@highguard.com.cn 第 1 页共 24 页 目录 1. ACCESSPORTAL 概述...4 1.1. AccessPortal 主页面

More information

院系▲

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

More information

国防常识

国防常识 ...1...14...14...18...19...26...28...30...31 97...40...40...41...42 ()...43...43...44...44...45...46 I ...47...47...48...49...49...52...53...54...54...55...57...58...59...61...62...62...64...66...68...69...72

More information

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

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

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

条款

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

More information

声 明 本 公 司 及 全 体 董 事 监 事 高 级 管 理 人 员 承 诺 不 存 在 任 何 虚 假 记 载 误 导 性 陈 述 或 重 大 遗 漏, 并 对 其 真 实 性 准 确 性 完 整 性 承 担 个 别 和 连 带 的 法 律 责 任 本 公 司 负 责 人 和 主 管 会 计 工

声 明 本 公 司 及 全 体 董 事 监 事 高 级 管 理 人 员 承 诺 不 存 在 任 何 虚 假 记 载 误 导 性 陈 述 或 重 大 遗 漏, 并 对 其 真 实 性 准 确 性 完 整 性 承 担 个 别 和 连 带 的 法 律 责 任 本 公 司 负 责 人 和 主 管 会 计 工 Shenzhen WitSoft Information Technology Co., Ltd. 主 办 券 商 二 〇 一 六 年 二 月 声 明 本 公 司 及 全 体 董 事 监 事 高 级 管 理 人 员 承 诺 不 存 在 任 何 虚 假 记 载 误 导 性 陈 述 或 重 大 遗 漏, 并 对 其 真 实 性 准 确 性 完 整 性 承 担 个 别 和 连 带 的 法 律 责 任 本

More information

SDK参考

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

More information

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc 在 VMWare-5.5+RedHat-9 下建立 本机 QTopia-2.1.1 虚拟平台 张大海 2008-5-9 一 资源下载 1. 需要以下安装包 : tmake-1.13.tar.gz qtopia-free-source-2.1.1.tar.gz qt-embedded-2.3.10-free.tar.gz qt-x11-2.3.2.tar.gz qt-x11-free-3.3.4.tar.gz

More information

沃通 (WoSign) 免费 SSL 证书 API 接口文档 编制 : 谭洪涛日期 : 审核 : 唐占国日期 : 批准 : 日期 : 版权所有, 严禁拷贝 - I - 保密信息

沃通 (WoSign) 免费 SSL 证书 API 接口文档 编制 : 谭洪涛日期 : 审核 : 唐占国日期 : 批准 : 日期 : 版权所有, 严禁拷贝 - I - 保密信息 沃通 (WoSign) 免费 SSL 证书 API 接口文档 编制 : 谭洪涛日期 : 2015-07-26 审核 : 唐占国日期 : 2015-07-28 批准 : 日期 : 版权所有, 严禁拷贝 - I - 保密信息 修订记录 版本日期修订内容修订者审核人 V1.0 2015/11/09 初稿谭洪涛唐占国 V1.1 2015/07/26 删除域名验证接口, 改为一次调用接口获取证书谭洪涛唐占国

More information

SDK参考

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

More information

百度xx SDK用户手册

百度xx SDK用户手册 社会化分享 Android 组件 用户手册 (1.1.0 版 ) 发布日期 : 2013 年 5 月 10 日 百度开发者中心 ( 版权所有, 翻版必究 ) 目录 第 1 章 概述... 3 第 2 章 运行环境... 3 第 3 章 使用说明... 3 3.1 新建工程... 3 3.2 引入社会化分享 JAR 包... 4 3.3 配置 ANDROIDMANIFEST.XML... 4 3.4

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

30.00% 25.00% 25.00% 22.50% 20.00% 15.00% 12.50% 15.00% 12.50% 10.00% 7.50% 5.00% 2.50% 2.50% 0.00% 文 学 理 学 工 学 法 学 教 育 学 管 理 学 历 史 学 艺 术 学 ( 三 ) 学 生

30.00% 25.00% 25.00% 22.50% 20.00% 15.00% 12.50% 15.00% 12.50% 10.00% 7.50% 5.00% 2.50% 2.50% 0.00% 文 学 理 学 工 学 法 学 教 育 学 管 理 学 历 史 学 艺 术 学 ( 三 ) 学 生 四 川 文 理 学 院 2014 年 本 科 教 学 质 量 报 告 2014 年 来, 在 教 育 主 管 部 门 的 关 怀 指 导 下, 在 学 校 党 政 班 子 的 正 确 领 导 下, 广 大 师 生 员 工 团 结 一 心, 按 照 国 家 中 长 期 教 育 改 革 和 发 展 规 划 纲 要 和 教 育 部 对 办 应 用 型 本 科 的 要 求, 深 入 贯 彻 落 实 学 校

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

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony Ioncube Php Encoder 8 3 Crack 4 ->>->>->> DOWNLOAD 1 / 5 2 / 5 Press..the..General..Tools..category4Encrypt..and..protect..files..with..PHP..encoding,..encryption,..ob fuscation..and..licensing... 2016

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

* 4 6 R P r p . 1 2 3 4 7 89bk 6 5 1 2 3 4 5 6 7 8 9 0 bk r bl bm bn^ bo bl br bq bpbo bn bm [ ] [ ] [ ] bp 8 2 4 6 bq p [ ] [SET] br clckbt bs bs bt ck cl. 1 2 1 2+- 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

快速上手产品文档

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

More information

chapter 2 HTML5 目錄iii HTML HTML HTML HTML HTML canvas

chapter 2 HTML5 目錄iii HTML HTML HTML HTML HTML canvas Contents 目錄 chapter 1 1-1... 1-2 1-2... 1-3 HTML5... 1-3... 1-5 1-3... 1-9 Web Storage... 1-9... 1-10 1-4 HTML5... 1-14... 1-14... 1-15 HTML5... 1-15... 1-15... 1-16 1-5... 1-18 Apps... 1-18 HTML5 Cache

More information

SDK参考

SDK参考 发布日期 2018-10-23 目录 目录 1 内容审核 SDK 环境搭建... 1 1.1 申请服务... 1 1.2 获取 SDK... 1 1.3 Java 开发环境配置... 1 1.4 Eclipse 安装与 SDK 工程导入... 2 1.5 AK/SK 认证... 3... 5 2.1 文本审核... 5 2.1.1 文本内容检测示例... 5 2.2 图像审核... 6 2.2.1

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション Perl CGI 1 Perl CGI 2 Perl CGI 3 Perl CGI 4 1. 2. 1. #!/usr/local/bin/perl 2. print "Content-type: text/html n n"; 3. print " n"; 4. print " n"; 3. 4.

More information

LETD型LED灯炮规格的更改

LETD型LED灯炮规格的更改 2018 十二月 1/10 页 软件错误问题软件错误 1 Automation Organizer(WindLDR) 软件之修复 针对版本 : WindLDR 版本 8.2.0 至版本 8.9.1 (Automation Organizer 版本 3.20 至 版本 3.12.1) 注 : 包括由官网下载的版本 当使用以上版本软件, 软件错误 1 将会出现在以下型号 : FC6A CPU 模块 -

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

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

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

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

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

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