更新时间:2023-11-08 GMT+08:00
分享

追加上传

功能说明

对同一个对象追加数据内容。

方法定义

ObsClient.appendObject

请求参数

字段名

类型

约束

说明

Bucket

String

必选

桶名。

Key

String

必选

对象名。

Position

Number

必选

追加上传的位置,第一次追加上传时必须为0。

ACL

String

可选

创建对象时可指定的预定义访问策略

StorageClass

String

可选

创建对象时可指定的对象的存储类型

Body

String

stream.Readable

可选

待上传对象的内容,支持字符串和stream.Readable对象。

Offset

Number

可选

当设置了SourceFile时有效,代表源文件中某一分段的起始偏移大小,默认值为0, 单位为字节。

SourceFile

String

可选

待上传对象的源文件路径。

Metadata

Object

可选

待上传对象的自定义元数据。

WebsiteRedirectLocation

String

可选

当桶设置了Website配置,该参数指明对象的重定向地址。

Expires

Number

可选

待上传对象的生命周期,单位:天。

SuccessActionRedirect

String

可选

上传对象成功后的重定向的地址。

ContentType

String

可选

待上传对象的MIME类型。

ContentLength

Number

可选

当设置了SourceFile时有效,代表待上传对象数据的长度。

ContentMD5

String

可选

待上传对象数据的MD5值(经过Base64编码),提供给OBS服务端,校验数据完整性。

SseKms

String

可选

以SSE-KMS方式加密对象,支持的值:

  • kms

SseKmsKey

String

可选

SSE-KMS方式下加密的主密钥,可为空。

SseC

String

可选

以SSE-C方式加密对象,支持的值:

  • AES256

SseCKey

Buffer

可选

SSE-C方式下加密的密钥,由AES256算法得到。

  • Body与SourceFile不能同时使用。
  • 当Body与SourceFile都为空时,上传对象的大小为0字节。

返回结果(InterfaceResult)

字段名

类型

说明

RequestId

String

OBS服务端返回的请求ID。

ETag

String

对象的ETag值。

NextPosition

String

下次追加上传的位置。

StorageClass

String

对象的存储类型,当对象存储类型是标准存储时,该值为空。

SseKms

String

SSE-KMS方式的算法。

SseKmsKey

String

SSE-KMS方式的密钥。

SseC

String

SSE-C方式的算法。

SseCKeyMd5

String

SSE-C方式的密钥的MD5值。

代码样例

// 引入obs库
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 使用源码安装
// var ObsClient = require('./lib/obs');

// 创建ObsClient实例
var obsClient = new ObsClient({
       //推荐通过环境变量获取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,
       server : 'https://your-endpoint'
});

// 第一次追加上传,起始位置必须为0
obsClient.appendObject({
       Bucket:'bucketname',
       Key:'objectname',
       Position : 0, 
       Body : 'Hello OBS'
}).then(function(result){
       console.log('Status-->' + result.CommonMsg.Status);
       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){
              if(err){
                     console.error('Error-->' + err);
              }else{
                     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,且最多支持10000次追加上传。
  • 追加上传成功后,可通过返回结果中InterfaceResult.NextPosition获取下次追加上传的位置;或者通过ObsClient.getObjectMetadata接口获取下次追加上传的位置。

相关文档