Skip to content

Commit 33d02bf

Browse files
authored
Merge pull request #112 from livehigh/feat/add-uploadFile
Feat/add upload file
2 parents 5f5f614 + a7ba757 commit 33d02bf

File tree

8 files changed

+199
-5
lines changed

8 files changed

+199
-5
lines changed

demo/demo.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,6 +1155,28 @@ function abortUploadTask() {
11551155
});
11561156
}
11571157

1158+
function uploadFile() {
1159+
var filename = '10mb.zip';
1160+
var blob = util.createFile({size: 1024 * 1024 * 10});
1161+
cos.uploadFile({
1162+
Bucket: config.Bucket, // Bucket 格式:test-1250000000
1163+
Region: config.Region,
1164+
Key: filename,
1165+
Body: blob,
1166+
SliceSize: 1024 * 1024 * 5, // 大于5mb才进行分块上传
1167+
onProgress: function (info) {
1168+
var percent = Math.floor(info.percent * 10000) / 100;
1169+
var speed = Math.floor(info.speed / 1024 / 1024 * 100) / 100;
1170+
logger.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
1171+
},
1172+
onFileFinish: function (err, data, options) {
1173+
logger.log(options.Key + ' 上传' + (err ? '失败' : '完成'));
1174+
},
1175+
}, function (err, data) {
1176+
logger.log('uploadFile:', err || data);
1177+
});
1178+
}
1179+
11581180
function sliceUploadFile() {
11591181
var blob = util.createFile({size: 1024 * 1024 * 3});
11601182
cos.sliceUploadFile({
@@ -1688,6 +1710,7 @@ function CIExample4(){
16881710
'putObject_base64ToBlob',
16891711

16901712
'header-高级操作',
1713+
'uploadFile',
16911714
'sliceUploadFile',
16921715
'selectFileToUpload',
16931716
'sliceCopyFile',
@@ -1711,6 +1734,7 @@ function CIExample4(){
17111734
var labelMap = {
17121735
putObject: '简单上传',
17131736
putObject_base64ToBlob: '简单上传:base64转blob',
1737+
uploadFile: '高级上传',
17141738
sliceUploadFile: '分片上传',
17151739
sliceCopyFile: '分片复制',
17161740
uploadFiles: '批量上传文件',

dist/cos-js-sdk-v5.js

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2422,7 +2422,7 @@ base.init(COS, task);
24222422
advance.init(COS, task);
24232423

24242424
COS.getAuthorization = util.getAuth;
2425-
COS.version = '1.2.12';
2425+
COS.version = '1.2.13';
24262426

24272427
module.exports = COS;
24282428

@@ -9342,6 +9342,52 @@ function abortUploadTaskArray(params, callback) {
93429342
});
93439343
}
93449344

9345+
// 高级上传
9346+
function uploadFile(params, callback) {
9347+
var self = this;
9348+
9349+
// 判断多大的文件使用分片上传
9350+
var SliceSize = params.SliceSize === undefined ? self.options.SliceSize : params.SliceSize;
9351+
9352+
var taskList = [];
9353+
9354+
var Body = params.Body;
9355+
var FileSize = Body.size || Body.length || 0;
9356+
var fileInfo = { TaskId: '' };
9357+
9358+
// 整理 option,用于返回给回调
9359+
util.each(params, function (v, k) {
9360+
if (typeof v !== 'object' && typeof v !== 'function') {
9361+
fileInfo[k] = v;
9362+
}
9363+
});
9364+
9365+
// 处理文件 TaskReady
9366+
var _onTaskReady = params.onTaskReady;
9367+
var onTaskReady = function (tid) {
9368+
fileInfo.TaskId = tid;
9369+
_onTaskReady && _onTaskReady(tid);
9370+
};
9371+
params.onTaskReady = onTaskReady;
9372+
9373+
// 处理文件完成
9374+
var _onFileFinish = params.onFileFinish;
9375+
var onFileFinish = function (err, data) {
9376+
_onFileFinish && _onFileFinish(err, data, fileInfo);
9377+
callback && callback(err, data);
9378+
};
9379+
9380+
// 添加上传任务,超过阈值使用分块上传,小于等于则简单上传
9381+
var api = FileSize > SliceSize ? 'sliceUploadFile' : 'putObject';
9382+
taskList.push({
9383+
api: api,
9384+
params: params,
9385+
callback: onFileFinish
9386+
});
9387+
9388+
self._addTasks(taskList);
9389+
}
9390+
93459391
// 批量上传文件
93469392
function uploadFiles(params, callback) {
93479393
var self = this;
@@ -9676,6 +9722,7 @@ function copySliceItem(params, callback) {
96769722
var API_MAP = {
96779723
sliceUploadFile: sliceUploadFile,
96789724
abortUploadTask: abortUploadTask,
9725+
uploadFile: uploadFile,
96799726
uploadFiles: uploadFiles,
96809727
sliceCopyFile: sliceCopyFile
96819728
};

dist/cos-js-sdk-v5.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

index.d.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1732,6 +1732,34 @@ Bulk:批量模式,恢复时间为24 - 48小时。 */
17321732
}[],
17331733
}
17341734

1735+
// uploadFile 高级上传
1736+
interface FileFinishInfo {
1737+
err: Error;
1738+
data: UploadFileItemResult;
1739+
options: UploadFileItemParams;
1740+
}
1741+
type onFileFinish = (params: FileFinishInfo) => void;
1742+
1743+
type UploadFileParams = (PutObjectParams | SliceUploadFileParams) & {
1744+
/** 要上传的本地文件路径 */
1745+
Body: UploadBody,
1746+
/** 使用 uploadFile 高级上传时,文件大小大于该数值将使用按分块上传,否则将调用简单上传,单位 Byte,默认值1048576(1MB) */
1747+
SliceSize?: number,
1748+
/** 上传的进度回调方法 */
1749+
onProgress?: onProgress,
1750+
/** 上传完成回调方法 */
1751+
onFileFinish?: onFileFinish,
1752+
}
1753+
1754+
interface UploadFileResult extends GeneralResult {
1755+
/** 对象的实体标签(Entity Tag),是对象被创建时标识对象内容的信息标签,可用于检查对象的内容是否发生变化,例如"8e0b617ca298a564c3331da28dcb50df"。此头部并不一定返回对象的 MD5 值,而是根据对象上传和加密方式而有所不同 */
1756+
ETag: ETag,
1757+
/** 创建的存储桶访问地址,不带 https:// 前缀,例如 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/images/1.jpg */
1758+
Location: string,
1759+
/** 对象的版本 ID */
1760+
VersionId?: VersionId,
1761+
}
1762+
17351763
// sliceCopyFile
17361764
/** sliceCopyFile 接口参数 */
17371765
interface SliceCopyFileParams extends ObjectParams {
@@ -2119,7 +2147,11 @@ declare class COS {
21192147
abortUploadTask(params: COS.AbortUploadTaskParams, callback: (err: COS.CosError, data: COS.AbortUploadTaskResult) => void): void;
21202148
abortUploadTask(params: COS.AbortUploadTaskParams): Promise<COS.AbortUploadTaskResult>;
21212149

2122-
/** 分片复制文件 */
2150+
/** 高级上传文件 */
2151+
uploadFile(params: COS.UploadFileParams, callback: (err: COS.CosError, data: COS.UploadFileResult) => void): void;
2152+
uploadFile(params: COS.UploadFileParams): Promise<COS.UploadFileResult>;
2153+
2154+
/** 批量上传文件 */
21232155
uploadFiles(params: COS.UploadFilesParams, callback: (err: COS.CosError, data: COS.UploadFilesResult) => void): void;
21242156
uploadFiles(params: COS.UploadFilesParams): Promise<COS.UploadFilesResult>;
21252157

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cos-js-sdk-v5",
3-
"version": "1.2.12",
3+
"version": "1.2.13",
44
"description": "JavaScript SDK for [腾讯云对象存储](https://cloud.tencent.com/product/cos)",
55
"main": "index.js",
66
"types": "index.d.ts",

src/advance.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,51 @@ function abortUploadTaskArray(params, callback) {
778778
});
779779
}
780780

781+
// 高级上传
782+
function uploadFile(params, callback) {
783+
var self = this;
784+
785+
// 判断多大的文件使用分片上传
786+
var SliceSize = params.SliceSize === undefined ? self.options.SliceSize : params.SliceSize;
787+
788+
var taskList = [];
789+
790+
var Body = params.Body;
791+
var FileSize = Body.size || Body.length || 0;
792+
var fileInfo = {TaskId: ''};
793+
794+
// 整理 option,用于返回给回调
795+
util.each(params, function (v, k) {
796+
if (typeof v !== 'object' && typeof v !== 'function') {
797+
fileInfo[k] = v;
798+
}
799+
});
800+
801+
// 处理文件 TaskReady
802+
var _onTaskReady = params.onTaskReady;
803+
var onTaskReady = function (tid) {
804+
fileInfo.TaskId = tid;
805+
_onTaskReady && _onTaskReady(tid);
806+
};
807+
params.onTaskReady = onTaskReady;
808+
809+
// 处理文件完成
810+
var _onFileFinish = params.onFileFinish;
811+
var onFileFinish = function (err, data) {
812+
_onFileFinish && _onFileFinish(err, data, fileInfo);
813+
callback && callback(err, data);
814+
};
815+
816+
// 添加上传任务,超过阈值使用分块上传,小于等于则简单上传
817+
var api = FileSize > SliceSize ? 'sliceUploadFile' : 'putObject';
818+
taskList.push({
819+
api: api,
820+
params: params,
821+
callback: onFileFinish,
822+
});
823+
824+
self._addTasks(taskList);
825+
}
781826

782827
// 批量上传文件
783828
function uploadFiles(params, callback) {
@@ -1113,6 +1158,7 @@ function copySliceItem(params, callback) {
11131158
var API_MAP = {
11141159
sliceUploadFile: sliceUploadFile,
11151160
abortUploadTask: abortUploadTask,
1161+
uploadFile: uploadFile,
11161162
uploadFiles: uploadFiles,
11171163
sliceCopyFile: sliceCopyFile,
11181164
};

src/cos.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,6 @@ base.init(COS, task);
6464
advance.init(COS, task);
6565

6666
COS.getAuthorization = util.getAuth;
67-
COS.version = '1.2.12';
67+
COS.version = '1.2.13';
6868

6969
module.exports = COS;

test/test.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3629,6 +3629,51 @@ group('restoreObject()', function () {
36293629
});
36303630
});
36313631

3632+
group('uploadFile()', function () {
3633+
// 高级上传
3634+
test('uploadFile() 高级上传', function (done, assert) {
3635+
var filename = '3m.zip';
3636+
var blob = util.createFile({size: 1024 * 1024 * 3});
3637+
cos.uploadFile({
3638+
Bucket: config.Bucket,
3639+
Region: config.Region,
3640+
Key: filename,
3641+
Body: blob,
3642+
}, function (err, data) {
3643+
console.log(data);
3644+
assert.ok(!err);
3645+
done();
3646+
});
3647+
});
3648+
test('uploadFile() 高级上传内容为空', function (done, assert) {
3649+
var filename = '3m.zip';
3650+
cos.uploadFile({
3651+
Bucket: config.Bucket,
3652+
Region: config.Region,
3653+
Key: filename,
3654+
Body: '',
3655+
}, function (err, data) {
3656+
assert.ok(!err);
3657+
done();
3658+
});
3659+
});
3660+
test('uploadFile() 高级上传 大于5mb则分块上传', function (done, assert) {
3661+
var filename = '3m.zip';
3662+
var blob = util.createFile({size: 1024 * 1024 * 3});
3663+
cos.uploadFile({
3664+
Bucket: config.Bucket,
3665+
Region: config.Region,
3666+
Key: filename,
3667+
Body: blob,
3668+
SliceSize: 1024 * 1024 * 5,
3669+
}, function (err, data) {
3670+
assert.ok(!err);
3671+
done();
3672+
});
3673+
});
3674+
});
3675+
3676+
36323677
group('uploadFiles()', function () {
36333678
test('uploadFiles()', function (done, assert) {
36343679
var filename = '1.zip';

0 commit comments

Comments
 (0)