断点续传上传
功能说明
对分段上传的封装和加强,解决上传大文件时由于网络不稳定或程序崩溃导致上传失败的问题。
方法定义
ObsClient.uploadFile
请求参数
字段名 |
类型 |
约束 |
说明 |
---|---|---|---|
Bucket |
String |
必选 |
桶名。 |
Key |
String |
必选 |
对象名。 |
UploadFile |
String |
必选 |
待上传的本地文件。 |
PartSize |
Number |
可选 |
分段大小,单位字节,取值范围是100KB~5GB,默认为5MB。 |
TaskNum |
Number |
可选 |
分段上传时的最大并发数,默认为20。 |
ProgressCallback |
Function |
可选 |
获取上传进度的回调函数。
说明:
该回调函数依次包含三个参数:已上传的字节数、总字节数、已使用的时间(单位:秒)。 |
ResumeCallback |
Function |
可选 |
获取取消断点续传控制参数的回调函数。
说明:
|
EnableCheckpoint |
Boolean |
可选 |
是否开启断点续传模式,默认为false,表示不开启。 |
CheckpointFile |
String |
可选 |
记录上传进度的文件,只在断点续传模式下有效。当该值为空时,默认与待上传的本地文件同目录。 |
EnableCheckSum |
Boolean |
可选 |
是否校验待上传文件的内容,只在断点续传模式下有效。默认为false,表示不校验。 |
ContentType |
String |
可选 |
对象的MIME类型。 |
ACL |
String |
可选 |
|
WebsiteRedirectLocation |
String |
可选 |
当桶设置了Website配置,该参数指明对象的重定向地址。 |
SseKms |
String |
可选 |
以SSE-KMS方式加密对象,支持的值:
|
SseKmsKey |
String |
可选 |
SSE-KMS方式下加密的主密钥,可为空。 |
sseC |
String |
可选 |
以SSE-C方式加密对象,支持的值:
|
SseCKey |
String |
可选 |
SSE-C方式下加密的密钥,由AES256算法得到。 |
Metadata |
Object |
可选 |
对象的自定义元数据信息。 |
返回结果(InterfaceResult)
字段名 |
类型 |
说明 |
---|---|---|
RequestId |
String |
OBS服务端返回的请求ID。 |
ETag |
String |
合并段后根据各个段的ETag值计算出的结果。 |
Bucket |
String |
合并段所在的桶。 |
Key |
String |
合并段后得到的对象名。 |
Location |
String |
合并段后得到的对象的url。 |
VersionId |
String |
合并段后得到的对象版本号。 |
SseKms |
String |
SSE-KMS方式的算法。 |
SseKmsKey |
String |
SSE-KMS方式的主密钥。 |
SseC |
String |
SSE-C方式的算法。 |
SseCKeyMd5 |
String |
SSE-C方式的密钥的MD5值。 |
代码样例
本示例用于断点续传上传本地example对象到examplebucket中并打印进度。
// 使用npm安装 var ObsClient = require('esdk-obs-nodejs'); // 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html const AK = process.env.AccessKeyID const SK = process.env.SecretAccessKey // 【可选】如果使用临时AKSK和SecurityToken访问OBS,则同样推荐通过环境变量获取 const security_token= process.env.SecurityToken // server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。 const server = "https://obs.cn-north-4.myhuaweicloud.com" var obsClient = new ObsClient({ access_key_id: AK, secret_access_key: SK, server: server, }); const Bucket = 'examplebucket' // 上传后的对象名 const Key = 'objectname' // 待上传的本地文件 const UploadFile = 'D:\\example' // 分段大小,单位字节,取值范围是100KB~5GB,默认为5MB const PartSize = 10 * 1024 * 1024 // 分段上传时的最大并发数,默认为20 const TaskNum = 10 // 接收取消断点续传上传任务控制参数 var hook; // 断点续传上传 try { obsClient.uploadFile({ Bucket, Key, UploadFile, PartSize, TaskNum, // 开启断点续传模式 EnableCheckpoint: true, // 进度回调 ProgressCallback: function (transferredAmount, totalAmount, totalSeconds) { // 打印上传速度,单位KB/S console.log(transferredAmount * 1.0 / totalSeconds / 1024); // 打印上传百分比 console.log(transferredAmount * 100.0 / totalAmount); // 当上传进度到达50%时暂停任务 // if(hook && (transferredAmount / totalAmount) > 0.5){ // // 暂停断点续传任务 // hook.cancel(); // } }, ResumeCallback: function (resumeHook) { // 获取取消断点续传上传任务控制参数 hook = resumeHook; } }, (err, result) => { if (err) { console.log('UploadFile Failed') console.error('Error-->' + err); } else { // 返回码为2xx时,接口调用成功,否则接口调用失败 if (result.CommonMsg.Status < 300) { console.log('UploadFile Succeeded') console.log('RequestId-->' + result.InterfaceResult.RequestId); console.log('Bucket-->' + result.InterfaceResult.Bucket); console.log('Key-->' + result.InterfaceResult.Key); console.log('Location-->' + result.InterfaceResult.Location); } else { console.log('UploadFile Failed') console.log('ErrorCode-->' + result.CommonMsg.Code); console.log('ErrorMessage-->' + result.CommonMsg.Message); } } }); } catch (error) { console.log('UploadFile Failed') console.error('Error-->' + error); }