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

断点续传上传

功能说明

对分段上传的封装和加强,解决上传大文件时由于网络不稳定或程序崩溃导致上传失败的问题。

方法定义

ObsClient.uploadFile

请求参数

字段名

类型

约束

说明

Bucket

String

必选

桶名。

Key

String

必选

对象名。

UploadFile

String

必选

待上传的本地文件。

PartSize

Number

可选

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

TaskNum

Number

可选

分段上传时的最大并发数,默认为20。

ProgressCallback

Function

可选

获取上传进度的回调函数。

说明:

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

ResumeCallback

Function

可选

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

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

EnableCheckpoint

Boolean

可选

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

CheckpointFile

String

可选

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

EnableCheckSum

Boolean

可选

是否校验待上传文件的内容,只在断点续传模式下有效。默认为false,表示不校验。

ContentType

String

可选

对象的MIME类型。

ACL

String

可选

预定义访问策略

WebsiteRedirectLocation

String

可选

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

SseKms

String

可选

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

  • kms

SseKmsKey

String

可选

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

sseC

String

可选

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

  • AES256

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

相关文档