流式上传(node.js sdk)-九游平台

开发过程中,您有任何问题可以在github上,或者在中发帖求助。
功能说明
本章节介绍上传单个对象到指定桶中。
接口约束
- 您必须是桶拥有者或拥有上传对象的权限,才能上传对象。建议使用iam或桶策略进行授权,如果使用iam则需授予obs:object:putobject权限,如果使用桶策略则需授予putobject权限。相关授权方式介绍可参见obs权限控制概述,配置方式详见、。
- obs支持的region与endpoint的对应关系,详细信息请参见。
- 单次上传对象大小范围是[0, 5gb]。
- 如果需要上传超过5gb的大文件,需要使用。
方法定义
obsclient.putobject(params)
请求参数
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
bucket |
string |
必选 |
参数解释: 桶名。 约束限制:
取值范围: 长度为3~63个字符。 默认取值: 无 |
key |
string |
必选 |
参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 约束限制: 无 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 |
acl |
可选 |
参数解释: 创建对象时可指定的预定义访问策略,有关访问控制列表(access control list,acl)功能的详细信息可参见acl功能介绍。 约束限制: 无 取值范围: 可选择的访问策略选项参见acltype。 默认取值: 无 |
|
storageclass |
可选 |
参数解释: 创建对象时,可以加上此头域设置对象的存储类别。 约束限制: 无 取值范围: 可选择的存储类别参见storageclasstype。 默认取值: 如果未设置此头域,则对象的存储列表默认为桶存储类别。 |
|
body |
string | stream.readable |
可选 |
参数解释: 待上传段的内容,支持字符串和stream.readable对象。 约束限制:
取值范围: 无 默认取值: 无 |
sourcefile |
string |
可选 |
参数解释: 待上传对象的源文件路径。 约束限制:
取值范围: 无 默认取值: 无 |
offset |
number |
可选 |
参数解释: 源文件中某一分段的起始偏移大小。 约束限制: offset和sourcefile配套使用,用于指定上传源文件中的某一部分数据。 取值范围: 非负整数,小于待上传对象的大小,单位:字节。 默认取值: 0 |
progresscallback |
function |
可选 |
参数解释: 获取上传进度的回调函数。 约束限制: 无 取值范围: 无 默认取值: 无
说明:
该回调函数依次包含三个参数:已上传的字节数、总字节数、已使用的时间(单位:秒)。 |
contentmd5 |
string |
可选 |
参数解释: 待上传对象数据的md5值(经过base64编码),提供给obs服务端,校验数据完整性。 约束限制: 消息体128-bit md5值经过base64编码后得到的字符串。 取值范围: 按照rfc 1864标准计算出消息体的md5摘要字符串,即消息体128-bit md5值经过base64编码后得到的字符串。 示例:n58ig6hfm7vqi4k0vnwpog==。 默认取值: 无 |
websiteredirectlocation |
string |
可选 |
参数解释: 当桶设置了website配置,可以将获取这个对象的请求重定向到桶内另一个对象或一个外部的url。 例如,重定向请求到桶内另一对象: websiteredirectlocation:/anotherpage.html 或重定向请求到一个外部url: websiteredirectlocation:http://www.example.com/ obs将这个值从头域中取出,保存在对象的元数据“websiteredirectlocation”中。 约束限制:
取值范围: 无 默认取值: 无 |
contenttype |
string |
可选 |
参数解释: 待上传对象的文件类型(mime类型)。content-type(mime)用于标识发送或接收数据的类型,浏览器根据该参数来决定数据的打开方式。 约束限制: 无 取值范围: 常见的content-type(mime)列表参见 默认取值: 如果您在上传object时未指定content-type,sdk会根据指定object名称的后缀名来判定文件类型并自动填充content-type。 |
contentlength |
int64 |
可选 |
参数解释: 待上传对象数据的长度。 约束限制:
取值范围: [0, 5gb]。 默认取值: 如果不传,则sdk会自动计算上传对象数据的长度。 |
ssekms |
string |
当使用sse-kms方式时,必选 |
参数解释: 表示服务端加密是sse-kms方式。对象使用sse-kms方式加密。 约束限制: 当前仅支持kms。 取值范围: 可选值:kms,即选择sse-kms方式加密对象。 默认取值: 无 |
ssekmskey |
string |
可选 |
参数解释: sse-kms加密方式下使用的kms主密钥的id值。 约束限制: 有效值支持两种格式:
其中:
取值范围: 无 默认取值:
|
ssec |
string |
当使用sse-c方式时,必选 |
参数解释: 表示服务端加密是sse-c方式。对象使用sse-c加密方式。 约束限制: 仅支持aes256。 取值范围: 可选值:aes256,即选择sse-c方式加密对象。 默认取值: 无 |
sseckey |
string |
当使用sse-c方式时,必选 |
参数解释: sse-c方式下加密使用的密钥,该密钥用于加密对象。 约束限制: 该头域由256bit的密钥经过base64编码得到,示例:k7qkypbkm5 hca27fsnkunnvaobncnlht/rcb2o/9cw= 取值范围: 无 默认取值: 无 |
metadata |
object |
可选 |
参数解释: 待上传对象的自定义元数据。obs支持用户使用以“x-obs-meta-”开头的消息头来加入自定义的元数据,以便对对象进行自定义管理。当用户获取此对象或查询此对象元数据时,加入的自定义元数据将会在返回的消息头中出现。 约束限制:
取值范围: 无 默认取值: 无 |
grantread |
string |
可选 |
参数解释: 被授予read权限的账号的账号id,即domain_id。账号被授予read权限后,针对当前对象,允许被授权指定账号有读对象和获取对象元数据的权限。 约束限制: 如果授权给多个租户,需要通过“,”分隔。 取值范围: 获取账号id的方法请参见 默认取值: 无 |
grantreadacp |
string |
可选 |
参数解释: 被授予read_acp权限的账号的账号id,即domain_id。账号被授予read_acp权限后,针对当前对象,允许读对象的acl。 约束限制: 如果授权给多个租户,需要通过“,”分隔。 取值范围: 获取账号id的方法请参见 默认取值: 无 |
grantwriteacp |
string |
可选 |
参数解释: 被授予write_acp权限的账号的账号id,即domain_id。账号被授予write_acp权限后,针对当前对象,允许修改对象的acl信息。 约束限制: 如果授权给多个租户,需要通过“,”分隔。 取值范围: 获取账号id的方法请参见 默认取值: 无 |
grantfullcontrol |
string |
可选 |
参数解释: 被授予full_control权限的账号的账号id,即domain_id。账号被授予full_control权限后,针对当前对象,授权指定账号有读对象、获取对象元数据、获取对象acl、写对象acl的权限。 约束限制: 如果授权给多个租户,需要通过“,”分隔。 取值范围: 获取账号id的方法请参见 默认取值: 无 |
expires |
number |
可选 |
参数解释: 表示对象的过期时间(从对象最后修改时间开始计算),过期之后对象会被自动删除。 约束限制:
取值范围: 1~(263-1),单位:天。 默认取值: 无 |
常量名 |
原始值 |
说明 |
---|---|---|
obsclient.enums.aclprivate |
private |
私有读写。 桶或对象的所有者拥有完全控制的权限,其他任何人都没有访问权限。 |
obsclient.enums.aclpublicread |
public-read |
公共读私有写。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本。 设在对象上,所有人可以获取该对象内容和元数据。 |
obsclient.enums.aclpublicreadwrite |
public-read-write |
公共读写。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本、上传对象、删除对象、初始化段任务、上传段、合并段、复制段、取消多段上传任务。 设在对象上,所有人可以获取该对象内容和元数据。 |
obsclient.enums.aclpublicreaddelivered |
public-read-delivered |
桶公共读,桶内对象公共读。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本,可以获取该桶内对象的内容和元数据。
说明:
aclpublicreaddelivered不能应用于对象。 |
obsclient.enums.aclpublicreadwritedelivered |
public-read-write-delivered |
桶公共读写,桶内对象公共读写。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本、上传对象、删除对象、初始化段任务、上传段、合并段、复制段、取消多段上传任务,可以获取该桶内对象的内容和元数据。
说明:
aclpublicreadwritedelivered不能应用于对象。 |
obsclient.enums.aclbucketownerfullcontrol |
bucket-owner-full-control |
设在对象上,桶和对象的所有者拥有对象的完全控制权限,其他任何人都没有访问权限。 默认情况下,上传对象至其他用户的桶中,桶拥有者没有对象的控制权限。对象拥有者为桶拥有者添加此权限控制策略后,桶所有者可以完全控制对象。例如,用户a上传对象x至用户b的桶中,系统默认用户b没有对象x的控制权。当用户a为对象x设置bucket-owner-full-control策略后,用户b就拥有了对象x的控制权。 |
常量名 |
原始值 |
说明 |
---|---|---|
obsclient.enums.storageclassstandard |
standard |
标准存储。 标准存储拥有低访问时延和较高的吞吐量,适用于有大量热点对象(平均一个月多次)或小对象(<1mb),且需要频繁访问数据的业务场景。 |
obsclient.enums.storageclasswarm |
warm |
低频访问存储。 低频访问存储适用于不频繁访问(平均一年少于12次)但在需要时也要求能够快速访问数据的业务场景。 |
obsclient.enums.storageclasscold |
cold |
归档存储。 归档存储适用于很少访问(平均一年访问一次)数据的业务场景。 |
无 |
deep_archive |
深度归档存储(受限公测) 适用于长期不访问(平均几年访问一次)数据的业务场景 |
返回结果
参数名称 |
参数类型 |
描述 |
---|---|---|
commonmsg |
参数解释: 接口调用完成后的公共信息,包含http状态码,操作失败的错误码等,详见icommonmsg。 |
|
interfaceresult |
参数解释: 操作成功后的结果数据,详见表7。 约束限制: 当status大于300时为空。 |
参数名称 |
参数类型 |
描述 |
status |
number |
参数解释: obs服务端返回的http状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见。 |
code |
string |
参数解释: obs服务端返回的错误码。 |
message |
string |
参数解释: obs服务端返回的错误描述。 |
hostid |
string |
参数解释: obs服务端返回的请求服务端id。 |
requestid |
string |
参数解释: obs服务端返回的请求id。 |
id2 |
string |
参数解释: obs服务端返回的请求id2。 |
indicator |
string |
参数解释: obs服务端返回的详细错误码。 |
参数名称 |
参数类型 |
描述 |
---|---|---|
requestid |
string |
参数解释: obs服务端返回的请求id。 |
storageclass |
参数解释: 对象的存储类别。 取值范围:
|
|
versionid |
string |
参数解释: 对象的版本号。如果桶的多版本状态为开启,则会返回对象的版本号。 |
etag |
string |
参数解释: 对象的etag值,即base64编码的128位md5摘要。etag是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时etag为a,下载对象时etag为b,则说明对象内容发生了变化。etag只反映变化的内容,而不是其元数据。上传的对象或复制操作创建的对象,都有唯一的etag。 约束限制: 当对象是服务端加密的对象时,etag值不是对象的md5值。 |
ssekms |
string |
参数解释: 表示服务端加密是sse-kms方式。对象使用sse-kms方式加密。 |
ssekmskey |
string |
参数解释: sse-kms加密方式下使用的kms主密钥的id值。 |
ssec |
string |
参数解释: 表示服务端加密是sse-c方式。对象使用sse-c加密方式。 |
sseckeymd5 |
string |
参数解释: sse-c方式下加密使用密钥的md5值,该值用于验证密钥传输过程中是否出错。 约束限制: 由密钥值经过md5加密再经过base64编码后得到,示例:4xvb3tbntn tieva0/fgaq== |
常量名 |
原始值 |
说明 |
---|---|---|
obsclient.enums.storageclassstandard |
standard |
标准存储。 标准存储拥有低访问时延和较高的吞吐量,适用于有大量热点对象(平均一个月多次)或小对象(<1mb),且需要频繁访问数据的业务场景。 |
obsclient.enums.storageclasswarm |
warm |
低频访问存储。 低频访问存储适用于不频繁访问(平均一年少于12次)但在需要时也要求能够快速访问数据的业务场景。 |
obsclient.enums.storageclasscold |
cold |
归档存储。 归档存储适用于很少访问(平均一年访问一次)数据的业务场景。 |
无 |
deep_archive |
深度归档存储(受限公测) 适用于长期不访问(平均几年访问一次)数据的业务场景 |
代码示例一:上传网络流
流式上传使用stream.readable作为对象的数据源。以下代码展示了如何通过网络流上传对象至名为examplebucket桶中。
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 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 66 67 |
// 引入obs库 // 使用npm安装 constobsclient=require("esdk-obs-nodejs"); // 使用源码安装 // var obsclient = require('./lib/obs'); // 创建obsclient实例 constobsclient=newobsclient({ // 推荐通过环境变量获取aksk,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险 // 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html access_key_id:process.env.access_key_id, secret_access_key:process.env.secret_access_key, // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入 // security_token: process.env.security_token, // endpoint填写bucket对应的endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写 server:"https://obs.cn-north-4.myhuaweicloud.com", }); asyncfunctiongetnetworkstream(){ // 定义网络流url consturl='https://www.example.com'; // 引入http库、https库 consthttp=require('http'); consthttps=require('https'); // 根据url选择对应的请求库 constrequest=url.startswith('http')?http:https; returnnewpromise((resolve,reject)=>{ request.get(url,res=>{ if(res.statuscode===200){ resolve(res); }else{ reject(res); }; }).on(reject); }); }; asyncfunctionputobject(){ try{ constparams={ // 指定存储桶名称 bucket:"examplebucket", // 指定对象名,此处以 example/objectname 为例 key:"example/objectname", // 指定网络流 body:awaitgetnetworkstream() }; // 网络流上传对象 constresult=awaitobsclient.putobject(params); if(result.commonmsg.status<=300){ console.log("put object(%s) under the bucket(%s) successful!!",params.key,params.bucket); console.log("requestid: %s",result.commonmsg.requestid); console.log("storageclass:%s, etag:%s",result.interfaceresult.storageclass,result.interfaceresult.etag); return; }; console.log("an obserror was found, which means your request sent to obs was rejected with an error response."); console.log("status: %d",result.commonmsg.status); console.log("code: %s",result.commonmsg.code); console.log("message: %s",result.commonmsg.message); console.log("requestid: %s",result.commonmsg.requestid); }catch(error){ console.log("an exception was found, which means the client encountered an internal problem when attempting to communicate with obs, for example, the client was unable to access the network."); console.log(error); }; }; putobject(); |
代码示例二:上传文件流
本示例用于文件流上传至名为examplebucket桶中。
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
// 引入obs库 // 使用npm安装 constobsclient=require("esdk-obs-nodejs"); // 使用源码安装 // var obsclient = require('./lib/obs'); // 创建obsclient实例 constobsclient=newobsclient({ // 推荐通过环境变量获取aksk,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险 // 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html access_key_id:process.env.access_key_id, secret_access_key:process.env.secret_access_key, // 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入 // security_token: process.env.security_token, // endpoint填写bucket对应的endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写 server:"https://obs.cn-north-4.myhuaweicloud.com", }); asyncfunctiongetfilestream(){ constfs=require('fs'); // 填写本地文件的完整路径,从本地文件中读取数据流。 // 如果本地文件的完整路径中未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件 returnfs.createreadstream('d:\\localpath\\examplefile.txt'); } asyncfunctionputobject(){ try{ constparams={ // 指定存储桶名称 bucket:"examplebucket", // 指定对象名,此处以 example/objectname 为例 key:"example/objectname", // 指定文件流 body:awaitgetfilestream() }; // 文件流上传对象 constresult=awaitobsclient.putobject(params); if(result.commonmsg.status<=300){ console.log("put bucket(%s) successful!",params.bucket); console.log("requestid: %s",result.commonmsg.requestid); return; } console.log("an obserror was found, which means your request sent to obs was rejected with an error response."); console.log("status: %d",result.commonmsg.status); console.log("code: %s",result.commonmsg.code); console.log("message: %s",result.commonmsg.message); console.log("requestid: %s",result.commonmsg.requestid); }catch(error){ console.log("an exception was found, which means the client encountered an internal problem when attempting to communicate with obs, for example, the client was unable to access the network."); console.log(error); }; }; putobject(); |
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨