Skip to content

Commit 2e235b3

Browse files
authored
Merge pull request #107 from livehigh/feat/add-uploadFile
feat:新增高级上传接口
2 parents 091cc91 + 802e644 commit 2e235b3

File tree

5 files changed

+166
-2
lines changed

5 files changed

+166
-2
lines changed

demo/demo.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,31 @@ function restartTask() {
11991199
console.log('restart');
12001200
}
12011201

1202+
function uploadFile() {
1203+
var filename = '3mb.zip';
1204+
var filepath = path.resolve(__dirname, filename);
1205+
util.createFile(filepath, 1024 * 1024 * 3, function (err) {
1206+
cos.uploadFile({
1207+
Bucket: config.Bucket,
1208+
Region: config.Region,
1209+
Key: filename,
1210+
FilePath: filepath,
1211+
SliceSize: 1024 * 1024 * 5, // 大于5mb才进行分块上传
1212+
onProgress: function (info) {
1213+
var percent = Math.floor(info.percent * 10000) / 100;
1214+
var speed = Math.floor(info.speed / 1024 / 1024 * 100) / 100;
1215+
console.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
1216+
},
1217+
onFileFinish: function (err, data, options) {
1218+
console.log(options.Key + ' 上传' + (err ? '失败' : '完成'));
1219+
},
1220+
}, function (err, data) {
1221+
console.log(err || data);
1222+
fs.unlinkSync(filepath);
1223+
});
1224+
});
1225+
}
1226+
12021227
function uploadFiles() {
12031228
var filepath = path.resolve(__dirname, '1mb.zip');
12041229
util.createFile(filepath, 1024 * 1024 * 10, function (err) {
@@ -1682,6 +1707,7 @@ function CIExample4(){
16821707
// selectObjectContentStream();
16831708
// selectObjectContent();
16841709
// sliceUploadFile();
1710+
// uploadFile();
16851711
// uploadFiles();
16861712
// cancelTask();
16871713
// pauseTask();

index.d.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1745,6 +1745,35 @@ Bulk:批量模式,恢复时间为24 - 48小时。 */
17451745
}[],
17461746
}
17471747

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

2172-
/** 分片复制文件 */
2201+
/** 高级上传文件 */
2202+
uploadFile(params: COS.UploadFileParams, callback: (err: COS.CosError, data: COS.UploadFileResult) => void): void;
2203+
uploadFile(params: COS.UploadFileParams): Promise<COS.UploadFileResult>;
2204+
2205+
/** 批量上传文件 */
21732206
uploadFiles(params: COS.UploadFilesParams, callback: (err: COS.CosError, data: COS.UploadFilesResult) => void): void;
21742207
uploadFiles(params: COS.UploadFilesParams): Promise<COS.UploadFilesResult>;
21752208

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cos-nodejs-sdk-v5",
3-
"version": "2.9.18",
3+
"version": "2.9.19",
44
"description": "cos nodejs sdk v5",
55
"main": "index.js",
66
"types": "index.d.ts",

sdk/advance.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,58 @@ function abortUploadTaskArray(params, callback) {
783783
});
784784
}
785785

786+
// 高级上传
787+
function uploadFile(params, callback) {
788+
var self = this;
789+
790+
// 判断多大的文件使用分片上传
791+
var SliceSize = params.SliceSize === undefined ? self.options.SliceSize : params.SliceSize;
792+
793+
// 开始处理每个文件
794+
var taskList = [];
795+
796+
fs.stat(params.FilePath, function (err, stat) {
797+
798+
var isDir = stat.isDirectory();
799+
var FileSize = params.ContentLength = stat.size || 0;
800+
var fileInfo = {TaskId: ''};
801+
802+
// 整理 option,用于返回给回调
803+
util.each(params, function (v, k) {
804+
if (typeof v !== 'object' && typeof v !== 'function') {
805+
fileInfo[k] = v;
806+
}
807+
});
808+
809+
// 处理文件 TaskReady
810+
var _onTaskReady = params.onTaskReady;
811+
var onTaskReady = function (tid) {
812+
fileInfo.TaskId = tid;
813+
_onTaskReady && _onTaskReady(tid);
814+
};
815+
params.onTaskReady = onTaskReady;
816+
817+
// 处理文件完成
818+
var _onFileFinish = params.onFileFinish;
819+
var onFileFinish = function (err, data) {
820+
_onFileFinish && _onFileFinish(err, data, fileInfo);
821+
callback && callback(err, data);
822+
};
823+
824+
// 添加上传任务
825+
var api = FileSize <= SliceSize || isDir ? 'putObject' : 'sliceUploadFile';
826+
if (api === 'putObject') {
827+
params.Body = isDir ? '' : fs.createReadStream(params.FilePath);
828+
params.Body.isSdkCreated = true;
829+
}
830+
taskList.push({
831+
api: api,
832+
params: params,
833+
callback: onFileFinish,
834+
});
835+
self._addTasks(taskList);
836+
});
837+
}
786838

787839
// 批量上传文件
788840
function uploadFiles(params, callback) {
@@ -1352,6 +1404,7 @@ function downloadFile(params, callback) {
13521404
var API_MAP = {
13531405
sliceUploadFile: sliceUploadFile,
13541406
abortUploadTask: abortUploadTask,
1407+
uploadFile: uploadFile,
13551408
uploadFiles: uploadFiles,
13561409
sliceCopyFile: sliceCopyFile,
13571410
downloadFile: downloadFile,

test/test.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3613,6 +3613,58 @@ group('restoreObject()', function () {
36133613
});
36143614
});
36153615

3616+
group('uploadFile()', function () {
3617+
test('uploadFile() 高级上传', function (done, assert) {
3618+
var filename = '3mb.zip';
3619+
var filepath = path.resolve(__dirname, filename);
3620+
util.createFile(filepath, 1024 * 1024 * 3, function (err) {
3621+
cos.uploadFile({
3622+
Bucket: config.Bucket,
3623+
Region: config.Region,
3624+
Key: filename,
3625+
FilePath: filepath,
3626+
}, function (err, data) {
3627+
assert.ok(!err);
3628+
fs.unlinkSync(filepath);
3629+
done();
3630+
});
3631+
});
3632+
});
3633+
test('uploadFile() 高级上传目录', function (done, assert) {
3634+
var filename = '3mb/';
3635+
var filepath = path.resolve(__dirname, filename);
3636+
util.createFile(filepath, 1024 * 1024 * 3, function (err) {
3637+
cos.uploadFile({
3638+
Bucket: config.Bucket,
3639+
Region: config.Region,
3640+
Key: filename,
3641+
FilePath: filepath,
3642+
}, function (err, data) {
3643+
assert.ok(!err);
3644+
fs.unlinkSync(filepath);
3645+
done();
3646+
});
3647+
});
3648+
});
3649+
test('uploadFile() 高级上传 大于5mb则分块上传', function (done, assert) {
3650+
var filename = '3mb.zip';
3651+
var filepath = path.resolve(__dirname, filename);
3652+
util.createFile(filepath, 1024 * 1024 * 3, function (err) {
3653+
cos.uploadFile({
3654+
Bucket: config.Bucket,
3655+
Region: config.Region,
3656+
Key: filename,
3657+
FilePath: filepath,
3658+
SliceSize: 1024 * 1024 * 5,
3659+
}, function (err, data) {
3660+
assert.ok(!err);
3661+
fs.unlinkSync(filepath);
3662+
done();
3663+
});
3664+
});
3665+
});
3666+
});
3667+
36163668
group('uploadFiles()', function () {
36173669
test('uploadFiles()', function (done, assert) {
36183670
var filename = '1.zip';

0 commit comments

Comments
 (0)