链接复制成功!
断点续传上传
功能说明
对分段上传的封装和加强,解决上传大文件时由于网络不稳定或程序崩溃导致上传失败的问题。
方法定义
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);
}