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

断点续传下载

功能说明

对范围下载的封装和加强,解决下载大对象到本地时由于网络不稳定或程序崩溃导致下载失败的问题。

方法定义

ObsClient.downloadFile

请求参数

字段名

类型

约束

说明

Bucket

String

必选

桶名。

Key

String

必选

对象名。

DownloadFile

String

可选

下载对象的本地文件全路径。当该值为空时,默认为当前程序的运行目录。

PartSize

Number

可选

分段大小,单位字节,取值范围是100KB~5GB,默认为5MB。

TaskNum

Number

可选

分段下载时的最大并发数,默认为20。

ProgressCallback

Function

可选

获取下载进度的回调函数。

说明:

该回调函数依次包含三个参数:已下载的字节数、总字节数、已使用的时间(单位:秒)。

ResumeCallback

Function

可选

获取取消断点续传控制参数的回调函数。

说明:
  • 该回调函数有一个参数:取消断点续传下载任务控制参数;
  • 可以调用取消断点续传下载任务控制参数的cancel方法来暂停断点续传下载任务。

EnableCheckpoint

Boolean

可选

是否开启断点续传模式,默认为false,表示不开启。

CheckpointFile

String

可选

记录下载进度的文件,只在断点续传模式下有效。当该值为空时,默认与下载对象的本地文件路径同目录。

VersionId

String

可选

对象的版本号。

IfModifiedSince

String

可选

如果对象的修改时间晚于该参数值指定的时间,则返回对象内容,否则返回异常码。

IfUnmodifiedSince

String

可选

如果对象的修改时间早于该参数值指定的时间,则返回对象内容,否则返回异常码。

IfMatch

String

可选

如果对象的ETag值与该参数值相同,则返回对象内容,否则返回异常码。

IfNoneMatch

String

可选

如果对象的ETag值与该参数值不相同,则返回对象内容,否则返回异常码。

SseC

String

可选

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

  • AES256

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);
}

相关文档