首先贴出官网的上传Demo
第一步: 实例化一个COS对象。 (这个对象可以用来操作后续的上传,下载等操作)
var COS = require('cos-js-sdk-v5');
var cos = new COS({
// 必选参数
getAuthorization: function (options, callback) {
// 服务端 JS 和 PHP 例子:https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/
// 服务端其他语言参考 COS STS SDK :https://github.com/tencentyun/qcloud-cos-sts-sdk
// STS 详细文档指引看:https://cloud.tencent.com/document/product/436/14048
$.get('http://example.com/server/sts.php', {
// 可从 options 取需要的参数
}, function (data) {
var credentials = data && data.credentials;
if (!data || !credentials) return console.error('credentials invalid');
callback({
TmpSecretId: credentials.tmpSecretId,
TmpSecretKey: credentials.tmpSecretKey,
XCosSecurityToken: credentials.sessionToken,
// 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
});
});
}
});
第二步:用实例化的COS对象去上传文件
cos.putObject({
Bucket: 'examplebucket-1250000000', /* 必须 */
Region: 'COS_REGION', /* 存储桶所在地域,必须字段 */
Key: 'exampleobject', /* 必须 */
StorageClass: 'STANDARD',
Body: fileObject, // 上传文件对象
onProgress: function(progressData) {
console.log(JSON.stringify(progressData));
}
}, function(err, data) {
console.log(err || data);
});
官网的第二步是没问题的 。
然后:
第一步存在一个比较隐晦的bug 某些情况下会遇到,如果你和我一样,折腾半天官网文档依旧无效,并且打debugger还发现进入第二步上传函数时候,COS突然回头又去创建一个新的COS实例 你可以参考我的写法:
将 第一步 改为:
// 初始化实例 *** d 为后端接口传入的临时秘钥信息
const cos = new COS({
SecretId: d.tmpSecretId,
SecretKey: d.tmpSecretKey,
XCosSecurityToken: d.token
});
也就是说 :
第一步 不要使用 getAuthorization 这个函数
直接new一个cos对象即可 我猜大概原因是因为后端创建临时秘钥时候已经生成了一个cos实例 这时候再用这个秘钥去getAuthorization会导致重复 所以后续上传会出现奇怪的bug
这个吐血的bug折腾我差不多一天 记录一下 转载请注明出处
https://blog.youkuaiyun.com/GGGyp/article/details/114525747