断点续传下载
功能说明
对范围下载的封装和加强,解决下载大对象到本地时由于网络不稳定或程序崩溃导致下载失败的问题。
方法定义
ObsClient.downloadFile
请求参数
字段名 |
类型 |
约束 |
说明 |
---|---|---|---|
Bucket |
String |
必选 |
桶名。 |
Key |
String |
必选 |
对象名。 |
DownloadFile |
String |
可选 |
下载对象的本地文件全路径。当该值为空时,默认为当前程序的运行目录。 |
PartSize |
Number |
可选 |
分段大小,单位字节,取值范围是100KB~5GB,默认为5MB。 |
TaskNum |
Number |
可选 |
分段下载时的最大并发数,默认为20。 |
ProgressCallback |
Function |
可选 |
获取下载进度的回调函数。 该回调函数依次包含三个参数:已下载的字节数、总字节数、已使用的时间(单位:秒)。 |
ResumeCallback |
Function |
可选 |
获取取消断点续传控制参数的回调函数。
|
EnableCheckpoint |
Boolean |
可选 |
是否开启断点续传模式,默认为false,表示不开启。 |
CheckpointFile |
String |
可选 |
记录下载进度的文件,只在断点续传模式下有效。当该值为空时,默认与下载对象的本地文件路径同目录。 |
VersionId |
String |
可选 |
对象的版本号。 |
IfModifiedSince |
String |
可选 |
如果对象的修改时间晚于该参数值指定的时间,则返回对象内容,否则返回异常码。 |
IfUnmodifiedSince |
String |
可选 |
如果对象的修改时间早于该参数值指定的时间,则返回对象内容,否则返回异常码。 |
IfMatch |
String |
可选 |
如果对象的ETag值与该参数值相同,则返回对象内容,否则返回异常码。 |
IfNoneMatch |
String |
可选 |
如果对象的ETag值与该参数值不相同,则返回对象内容,否则返回异常码。 |
SseC |
String |
可选 |
以SSE-C方式解密对象,支持的值:
|
SseCKey |
String |
可选 |
SSE-C方式下解密的密钥,由AES256算法算出。 |
返回结果(InterfaceResult)
字段名 |
类型 |
说明 |
---|---|---|
RequestId |
String |
OBS服务端返回的请求ID。 |
DeleteMarker |
String |
标识删除的对象是否是删除标记。 |
LastModified |
String |
对象的最近一次修改时间。 |
CacheControl |
String |
响应中的Cache-Control头。 |
ContentDisposition |
String |
响应中的Content-Disposition头。 |
ContentEncoding |
String |
响应中的Content-Encoding头。 |
ContentLanguage |
String |
响应中的Content-Language头。 |
ContentType |
String |
对象的MIME类型。 |
Expires |
String |
响应中的Expires头。 |
ETag |
String |
对象的ETag值。 |
VersionId |
String |
对象的版本号。 |
WebsiteRedirectLocation |
String |
当桶设置了Website配置,该参数指明对象的重定向地址。 |
StorageClass |
String |
对象的存储类型,当对象存储类型是标准存储时,该值为空。 |
Restore |
String |
归档存储类型对象的取回状态。 |
SseKms |
String |
SSE-KMS方式的算法。 |
SseKmsKey |
String |
SSE-KMS方式的主密钥。 |
SseC |
String |
SSE-C方式的算法。 |
SseCKeyMd5 |
String |
SSE-C方式的密钥的MD5值。 |
Expiration |
String |
对象的详细过期信息。 |
Metadata |
Object |
对象自定义元数据。 |
代码样例
本示例用于断点续传下载examplebucket桶里的objectname对象并打印进度。
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
// 您可以登录访问管理控制台获取访问密钥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 DownloadFile = 'D:\\example'
// 设置分段大小为10MB
const PartSize = 10 * 1024 * 1024
// 并发数
const TaskNum = 10
// 接收取消断点续传下载任务控制参数
var hook;
// 断点续传下载
try {
obsClient.downloadFile({
Bucket,
Key,
DownloadFile,
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('DownloadFile Failed')
console.error('Error-->' + err);
} else {
if (result.CommonMsg.Status < 300) {
console.log('DownloadFile Succeeded')
console.log('RequestId-->' + result.InterfaceResult.RequestId);
console.log('LastModified-->' + result.InterfaceResult.LastModified);
console.log('Metadata-->' + JSON.stringify(result.InterfaceResult.Metadata));
} else {
console.log('DownloadFile Failed')
console.log('ErrorCode-->' + result.CommonMsg.Code);
console.log('ErrorMessage-->' + result.CommonMsg.Message);
}
}
});
} catch (error) {
console.log('DownloadFile Failed')
console.error('Error-->' + error);
}