Skip to content

Commit c3bf0c3

Browse files
authored
Dev/callback (#210)
上传支持 callback
1 parent 1c0e9c4 commit c3bf0c3

File tree

10 files changed

+364
-67
lines changed

10 files changed

+364
-67
lines changed

demo/demo.js

Lines changed: 60 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,29 @@ function deleteBucketEncryption() {
916916
);
917917
}
918918

919+
var callback = {
920+
callbackUrl: 'http://xxx/callback',
921+
callbackHost: 'xxx',
922+
callbackBody: 'key=${object}&etag=${etag}&my_var=${x:my_var}&my_var1=123',
923+
callbackBodyType: 'application/x-www-form-urlencoded',
924+
};
925+
var callbackVar = { 'x:my_var': 'value1' };
926+
927+
var returnBody = {
928+
bucket: '${bucket}',
929+
key: '${object}',
930+
filesize: '${size}',
931+
mime_type: '${mimeType}',
932+
// 视频类型
933+
// video_bit_rate: '${videoInfo.video.bit_rate}',
934+
// "video_codec_name": "${videoInfo.video.codec_name}",
935+
// "video_profile": "${videoInfo.video.profile}",
936+
// "video_pix_fmt": "${videoInfo.video.pix_fmt}",
937+
// "audio_bit_rate": "${videoInfo.audio.bit_rate}",
938+
// "audio_codec_name": "${videoInfo.audio.codec_name}",
939+
// "duration": "${videoInfo.format.duration}",
940+
};
941+
919942
function putObject() {
920943
// 创建测试文件
921944
var filename = '1mb.zip';
@@ -928,23 +951,29 @@ function putObject() {
928951
Key: filename, // 必须
929952
// 常见场景是使用 input[type="file"] 标签选择文件后上传,可参考 selectFileToUpload
930953
Body: blob,
954+
// Callback: COS.util.encodeBase64(JSON.stringify(callback)),
955+
// ReturnBody: COS.util.encodeBase64(JSON.stringify(returnBody)),
956+
// PicOperations: '{"is_pic_info": 1, "rules": [{"fileid": "test.jpg", "rule": "imageMogr2/thumbnail/!50p"}]}',
931957
onTaskReady: function (tid) {
932958
TaskId = tid;
933959
logger.log('onTaskReady', tid);
934960
},
935-
onTaskStart: function (info) {
936-
logger.log('onTaskStart', info);
937-
},
938961
onProgress: function (progressData) {
939962
logger.log(JSON.stringify(progressData));
940963
},
941-
Headers: {
942-
// 万象持久化接口,上传时持久化
943-
// 'Pic-Operations': '{"is_pic_info": 1, "rules": [{"fileid": "test.jpg", "rule": "imageMogr2/thumbnail/!50p"}]}'
944-
},
945964
},
946965
function (err, data) {
947-
logger.log('putObject:', err.code || data);
966+
if (err) {
967+
console.log('上传失败');
968+
} else {
969+
console.log('上传成功');
970+
if (data.CallbackError) {
971+
console.log('回调失败', data.CallbackError?.Code);
972+
} else {
973+
console.log('回调成功', data.CallbackBody);
974+
}
975+
}
976+
logger.log('putObject:', err || data);
948977
}
949978
);
950979
}
@@ -1271,13 +1300,26 @@ function uploadFile() {
12711300
Key: filename,
12721301
Body: blob,
12731302
SliceSize: 1024 * 1024 * 5, // 大于5mb才进行分块上传
1303+
Callback: COS.util.encodeBase64(JSON.stringify(callback)),
1304+
// ReturnBody: COS.util.encodeBase64(JSON.stringify(returnBody)),
1305+
// PicOperations: '{"is_pic_info": 1, "rules": [{"fileid": "test.jpg", "rule": "imageMogr2/thumbnail/!50p"}]}',
12741306
onProgress: function (info) {
12751307
var percent = Math.floor(info.percent * 10000) / 100;
12761308
var speed = Math.floor((info.speed / 1024 / 1024) * 100) / 100;
12771309
logger.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;');
12781310
},
12791311
},
12801312
function (err, data) {
1313+
if (err) {
1314+
console.log('上传失败');
1315+
} else {
1316+
console.log('上传成功');
1317+
if (data.CallbackError) {
1318+
console.log('回调失败', data.CallbackError?.Code);
1319+
} else {
1320+
console.log('回调成功', data.CallbackBody);
1321+
}
1322+
}
12811323
logger.log('uploadFile:', err || data);
12821324
}
12831325
);
@@ -1291,10 +1333,7 @@ function sliceUploadFile() {
12911333
Region: config.Region,
12921334
Key: '3mb.jpg', // 必须
12931335
Body: blob,
1294-
Headers: {
1295-
// 支持万象持久化接口,上传时持久化
1296-
// 'Pic-Operations': '{"is_pic_info": 1, "rules": [{"fileid": "test.jpg", "rule": "imageMogr2/thumbnail/!50p"}]}'
1297-
},
1336+
// Callback: COS.util.encodeBase64(JSON.stringify(callback)),
12981337
onTaskReady: function (tid) {
12991338
TaskId = tid;
13001339
},
@@ -1316,19 +1355,17 @@ function selectFileToUpload() {
13161355
util.selectLocalFile(function (files) {
13171356
var file = files && files[0];
13181357
if (!file) return;
1319-
if (file.size > 1024 * 1024) {
1358+
if (file.size > 1024 * 1024 * 3) {
13201359
cos.sliceUploadFile(
13211360
{
13221361
Bucket: config.Bucket, // Bucket 格式:test-1250000000
13231362
Region: config.Region,
13241363
Key: file.name,
13251364
Body: file,
1326-
onTaskReady: function (tid) {
1327-
TaskId = tid;
1328-
},
1329-
onProgress: function (progressData) {
1330-
logger.log('onProgress', JSON.stringify(progressData));
1331-
},
1365+
// Callback: COS.util.encodeBase64(JSON.stringify(callback)),
1366+
// CallbackVar: COS.util.encodeBase64(JSON.stringify(callbackVar)),
1367+
// ReturnBody: COS.util.encodeBase64(JSON.stringify(returnBody)),
1368+
// PicOperations: '{"is_pic_info": 1, "rules": [{"fileid": "test.jpg", "rule": "imageMogr2/thumbnail/!50p"}]}',
13321369
},
13331370
function (err, data) {
13341371
logger.log('selectFileToUpload:', err || data);
@@ -1341,12 +1378,10 @@ function selectFileToUpload() {
13411378
Region: config.Region,
13421379
Key: file.name,
13431380
Body: file,
1344-
onTaskReady: function (tid) {
1345-
TaskId = tid;
1346-
},
1347-
onProgress: function (progressData) {
1348-
logger.log(JSON.stringify(progressData));
1349-
},
1381+
// Callback: COS.util.encodeBase64(JSON.stringify(callback)),
1382+
// CallbackVar: COS.util.encodeBase64(JSON.stringify(callbackVar)),
1383+
// ReturnBody: COS.util.encodeBase64(JSON.stringify(returnBody)),
1384+
// PicOperations: '{"is_pic_info": 1, "rules": [{"fileid": "test.jpg", "rule": "imageMogr2/thumbnail/!50p"}]}',
13501385
},
13511386
function (err, data) {
13521387
logger.log('selectFileToUpload:', err || data);

dist/cos-js-sdk-v5.js

Lines changed: 76 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7281,7 +7281,7 @@ module.exports = function(module) {
72817281
/*! exports provided: name, version, description, main, types, scripts, repository, keywords, author, license, bugs, homepage, dependencies, devDependencies, default */
72827282
/***/ (function(module) {
72837283

7284-
module.exports = JSON.parse("{\"name\":\"cos-js-sdk-v5\",\"version\":\"1.8.1\",\"description\":\"JavaScript SDK for [腾讯云对象存储](https://cloud.tencent.com/product/cos)\",\"main\":\"dist/cos-js-sdk-v5.js\",\"types\":\"index.d.ts\",\"scripts\":{\"prettier\":\"prettier --write src demo/demo.js demo/CIDemos/*.js test/test.js server/sts.js lib/request.js index.d.ts\",\"server\":\"node server/sts.js\",\"dev\":\"cross-env NODE_ENV=development webpack -w --mode=development\",\"build\":\"cross-env NODE_ENV=production webpack --mode=production\",\"cos-auth.min.js\":\"uglifyjs ./demo/common/cos-auth.js -o ./demo/common/cos-auth.min.js -c -m\",\"test\":\"jest --runInBand --coverage\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/tencentyun/cos-js-sdk-v5.git\"},\"keywords\":[],\"author\":\"carsonxu\",\"license\":\"ISC\",\"bugs\":{\"url\":\"https://github.com/tencentyun/cos-js-sdk-v5/issues\"},\"homepage\":\"https://github.com/tencentyun/cos-js-sdk-v5#readme\",\"dependencies\":{\"@xmldom/xmldom\":\"^0.8.6\"},\"devDependencies\":{\"@babel/core\":\"7.17.9\",\"@babel/plugin-transform-runtime\":\"7.18.10\",\"@babel/preset-env\":\"7.16.11\",\"babel-loader\":\"8.2.5\",\"body-parser\":\"^1.18.3\",\"cross-env\":\"^5.2.0\",\"express\":\"^4.16.4\",\"jest\":\"^29.3.1\",\"jest-environment-jsdom\":\"^29.3.1\",\"prettier\":\"^3.0.1\",\"qcloud-cos-sts\":\"^3.0.2\",\"request\":\"^2.87.0\",\"terser-webpack-plugin\":\"4.2.3\",\"uglifyjs\":\"^2.4.11\",\"webpack\":\"4.46.0\",\"webpack-cli\":\"4.10.0\"}}");
7284+
module.exports = JSON.parse("{\"name\":\"cos-js-sdk-v5\",\"version\":\"1.8.2\",\"description\":\"JavaScript SDK for [腾讯云对象存储](https://cloud.tencent.com/product/cos)\",\"main\":\"dist/cos-js-sdk-v5.js\",\"types\":\"index.d.ts\",\"scripts\":{\"prettier\":\"prettier --write src demo/demo.js demo/CIDemos/*.js test/test.js server/sts.js lib/request.js index.d.ts\",\"server\":\"node server/sts.js\",\"dev\":\"cross-env NODE_ENV=development webpack -w --mode=development\",\"build\":\"cross-env NODE_ENV=production webpack --mode=production\",\"cos-auth.min.js\":\"uglifyjs ./demo/common/cos-auth.js -o ./demo/common/cos-auth.min.js -c -m\",\"test\":\"jest --runInBand --coverage\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/tencentyun/cos-js-sdk-v5.git\"},\"keywords\":[],\"author\":\"carsonxu\",\"license\":\"ISC\",\"bugs\":{\"url\":\"https://github.com/tencentyun/cos-js-sdk-v5/issues\"},\"homepage\":\"https://github.com/tencentyun/cos-js-sdk-v5#readme\",\"dependencies\":{\"@xmldom/xmldom\":\"^0.8.6\"},\"devDependencies\":{\"@babel/core\":\"7.17.9\",\"@babel/plugin-transform-runtime\":\"7.18.10\",\"@babel/preset-env\":\"7.16.11\",\"babel-loader\":\"8.2.5\",\"body-parser\":\"^1.18.3\",\"cross-env\":\"^5.2.0\",\"express\":\"^4.16.4\",\"jest\":\"^29.3.1\",\"jest-environment-jsdom\":\"^29.3.1\",\"prettier\":\"^3.0.1\",\"qcloud-cos-sts\":\"^3.0.2\",\"request\":\"^2.87.0\",\"terser-webpack-plugin\":\"4.2.3\",\"uglifyjs\":\"^2.4.11\",\"webpack\":\"4.46.0\",\"webpack-cli\":\"4.10.0\"}}");
72857285

72867286
/***/ }),
72877287

@@ -7340,7 +7340,7 @@ function sliceUploadFile(params, callback) {
73407340
var metaHeaders = {};
73417341
util.each(params.Headers, function (val, k) {
73427342
var shortKey = k.toLowerCase();
7343-
if (shortKey.indexOf('x-cos-meta-') === 0 || shortKey === 'pic-operations') {
7343+
if (shortKey.indexOf('x-cos-meta-') === 0 || ['pic-operations', 'x-cos-callback', 'x-cos-callback-var', 'x-cos-return-body'].includes(shortKey)) {
73447344
metaHeaders[k] = val;
73457345
}
73467346
});
@@ -11556,20 +11556,51 @@ function multipartComplete(params, callback) {
1155611556
isLocation: true
1155711557
});
1155811558
var res = data.CompleteMultipartUploadResult || {};
11559+
// pic-operations 处理
1155911560
if (res.ProcessResults) {
11560-
if (res && res.ProcessResults) {
11561-
res.UploadResult = {
11562-
OriginalInfo: {
11563-
Key: res.Key,
11564-
Location: url,
11565-
ETag: res.ETag,
11566-
ImageInfo: res.ImageInfo
11567-
},
11568-
ProcessResults: res.ProcessResults
11561+
res.UploadResult = {
11562+
OriginalInfo: {
11563+
Key: res.Key,
11564+
Location: url,
11565+
ETag: res.ETag,
11566+
ImageInfo: res.ImageInfo
11567+
},
11568+
ProcessResults: res.ProcessResults
11569+
};
11570+
delete res.ImageInfo;
11571+
delete res.ProcessResults;
11572+
}
11573+
// callback 处理
11574+
if (res.CallbackResult) {
11575+
var callbackResult = res.CallbackResult;
11576+
if (callbackResult.Status === '200' && callbackResult.CallbackBody) {
11577+
try {
11578+
res.CallbackBody = JSON.parse(util.decodeBase64(callbackResult.CallbackBody));
11579+
} catch (e) {
11580+
res.CallbackBody = {};
11581+
}
11582+
} else {
11583+
res.CallbackError = callbackResult.Error || {};
11584+
}
11585+
delete res.CallbackResult;
11586+
}
11587+
// returnBody 处理
11588+
if (res.ReturnBodyResult) {
11589+
var returnBodyResult = res.ReturnBodyResult;
11590+
if (returnBodyResult.Status === '200' && returnBodyResult.ReturnBody) {
11591+
try {
11592+
res.ReturnBody = JSON.parse(util.decodeBase64(returnBodyResult.ReturnBody));
11593+
} catch (e) {
11594+
res.ReturnBody = {};
11595+
}
11596+
} else {
11597+
res.ReturnError = {
11598+
Code: returnBodyResult.Code,
11599+
Message: returnBodyResult.Message,
11600+
Status: returnBodyResult.Status
1156911601
};
11570-
delete res.ImageInfo;
11571-
delete res.ProcessResults;
1157211602
}
11603+
delete res.ReturnBodyResult;
1157311604
}
1157411605
var result = util.extend(res, {
1157511606
Location: url,
@@ -12564,6 +12595,29 @@ function _submitRequest(params, callback) {
1256412595
err = util.extend(err || {}, attrs);
1256512596
callback(err, null);
1256612597
} else {
12598+
// putObject 返回回调处理
12599+
if (params.Action === 'name/cos:PutObject') {
12600+
var pHeaders = {};
12601+
for (var i in params.headers) {
12602+
var key = i.toLowerCase();
12603+
pHeaders[key] = params.headers[i];
12604+
}
12605+
if (pHeaders['x-cos-callback']) {
12606+
if (data.Error) {
12607+
data.CallbackError = util.clone(data.Error);
12608+
delete data.Error;
12609+
} else {
12610+
data.CallbackBody = util.clone(data);
12611+
}
12612+
} else if (pHeaders['x-cos-return-body']) {
12613+
if (data.Error) {
12614+
data.ReturnError = util.clone(data.Error);
12615+
delete data.Error;
12616+
} else {
12617+
data.ReturnBody = util.clone(data);
12618+
}
12619+
}
12620+
}
1256712621
data = util.extend(data || {}, attrs);
1256812622
callback(null, data);
1256912623
}
@@ -14190,7 +14244,10 @@ var formatParams = function formatParams(apiName, params) {
1419014244
'x-cos-server-side-encryption-cos-kms-key-id': 'SSEKMSKeyId',
1419114245
'x-cos-server-side-encryption-context': 'SSEContext',
1419214246
// 上传时图片处理
14193-
'Pic-Operations': 'PicOperations'
14247+
'Pic-Operations': 'PicOperations',
14248+
'x-cos-callback': 'Callback',
14249+
'x-cos-callback-var': 'CallbackVar',
14250+
'x-cos-return-body': 'ReturnBody'
1419414251
};
1419514252
util.each(headerMap, function (paramKey, headerKey) {
1419614253
if (params[paramKey] !== undefined) {
@@ -14460,6 +14517,10 @@ var encodeBase64 = function encodeBase64(str, safe) {
1446014517
}
1446114518
return base64Str;
1446214519
};
14520+
var decodeBase64 = function decodeBase64(base64Str) {
14521+
if (!base64Str) return '';
14522+
return base64.decode(base64Str);
14523+
};
1446314524
var simplifyPath = function simplifyPath(path) {
1446414525
var names = path.split('/');
1446514526
var stack = [];
@@ -14553,6 +14614,7 @@ var util = {
1455314614
isCIHost: isCIHost,
1455414615
isIOS_QQ: isIOS && isQQ,
1455514616
encodeBase64: encodeBase64,
14617+
decodeBase64: decodeBase64,
1455614618
simplifyPath: simplifyPath,
1455714619
readAsBinaryString: readAsBinaryString,
1455814620
parseResBody: parseResBody

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: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,6 +1317,10 @@ declare namespace COS {
13171317
Location: string;
13181318
/** 对象的版本 ID */
13191319
VersionId?: VersionId;
1320+
CallbackBody?: Record<string, any>;
1321+
CallbackError?: Record<string, any>;
1322+
ReturnBody?: Record<string, any>;
1323+
ReturnError?: Record<string, any>;
13201324
}
13211325

13221326
/** appendObject 接口参数 */
@@ -1802,6 +1806,10 @@ Bulk:批量模式,恢复时间为24 - 48小时。 */
18021806
Location: string;
18031807
/** 对象的版本 ID */
18041808
VersionId?: VersionId;
1809+
CallbackBody?: Record<string, any>;
1810+
CallbackError?: Record<string, any>;
1811+
ReturnBody?: Record<string, any>;
1812+
ReturnError?: Record<string, any>;
18051813
}
18061814

18071815
// abortUploadTask
@@ -1883,6 +1891,10 @@ Bulk:批量模式,恢复时间为24 - 48小时。 */
18831891
Location: string;
18841892
/** 对象的版本 ID */
18851893
VersionId?: VersionId;
1894+
CallbackBody?: Record<string, any>;
1895+
CallbackError?: Record<string, any>;
1896+
ReturnBody?: Record<string, any>;
1897+
ReturnError?: Record<string, any>;
18861898
}
18871899

18881900
// sliceCopyFile

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.8.1",
3+
"version": "1.8.2",
44
"description": "JavaScript SDK for [腾讯云对象存储](https://cloud.tencent.com/product/cos)",
55
"main": "dist/cos-js-sdk-v5.js",
66
"types": "index.d.ts",

src/advance.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ function sliceUploadFile(params, callback) {
4848
var metaHeaders = {};
4949
util.each(params.Headers, function (val, k) {
5050
var shortKey = k.toLowerCase();
51-
if (shortKey.indexOf('x-cos-meta-') === 0 || shortKey === 'pic-operations') {
51+
if (
52+
shortKey.indexOf('x-cos-meta-') === 0 ||
53+
['pic-operations', 'x-cos-callback', 'x-cos-callback-var', 'x-cos-return-body'].includes(shortKey)
54+
) {
5255
metaHeaders[k] = val;
5356
}
5457
});

0 commit comments

Comments
 (0)