问题遇到的现象和发生背景
在使用腾讯云对象存储的时候用测试方法暴露了secret_id是可以上传的,但是控制台只能使用临时地址预览,不能使用对象地址
在使用了官方文档的推荐使用临时密钥,就上传不了,后台api数据传输也没问题,小程序前端的数据也是有的,就是上传不了,没理解其中原理,不知道咋整
问题相关代码,请勿粘贴截图
小程序:
//点击选择图片
uploadimage:function(){
var that =this
wx.chooseImage({//从本地相册调用
count: 9,
sizeType:['original','compressed'],
sourceType:['album','camera'],
success:function(res){
that.setData({
// imagelsit:res.tempFilePaths直接覆盖掉默认的图片
imagelsit:that.data.imagelsit.concat(res.tempFilePaths)//拼接默认图片上传
});
},//成功
fail:function(res){console.log('222')},//失败
complete:function(){console.log('111')},//无论成功与否
})
},
//点击上传图片
clickupdate:function () {
// var onlineImageList = []
// var myDate = new Date();
//直接使用密钥
// var cos = new COS({
//SecretId: 'AKID1sUpthEUUhyyhHIOYu2tTnqc7LJ1TeYCZfV',
//SecretKey: 'auwhFXYNxGI3YmlTu5zcy4tRjlWzB6mB',
// });
//获取临时密钥
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
wx.request({
url: 'http://127.0.0.1:8000/api/credential/',
data: {
// 可从 options 取需要的参数
},
dataType:'json',
success: function (result) {
console.log('成功')
var data = result.date;
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
});
}
});
}
});
for(var index in this.data.imagelsit){
var filepath = this.data.imagelsit[index];
cos.postObject({
Bucket: 'ly18235293550-1310030284',
Region: 'ap-beijing',
Key: index+'-x.png',
FilePath: filepath,
onProgress: function (info) {
console.log(JSON.stringify(info));
}
}, function (err, data) {
//onlineImageList.push(data.location);
console.log( err || data);
});
}
},
class CredentialView(APIView):
def get(self, request, *args, **kwargs):
config = {
'url': 'https://sts.tencentcloudapi.com/',
# 域名,非必须,默认为 sts.tencentcloudapi.com
'domain': 'sts.tencentcloudapi.com',
# 临时密钥有效时长,单位是秒
'duration_seconds': 1800,
'secret_id': settings.TENCENT_SECRET_ID,
# 固定密钥
'secret_key': settings.TENCENT_SECRET_KEY,
# 换成你的 bucket
'bucket': 'ly18235293550-1310030284',
# 换成 bucket 所在地区
'region': settings.TENCENT_AREA,
# 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径
# 例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
'allow_prefix': '*',
# 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
'allow_actions': [
# 简单上传
# 'name/cos:PutObject',
'name/cos:PostObject',
],
}
try:
sts = Sts(config)
response = sts.get_credential()
print(response)
print('get data : ' + json.dumps(dict(response), indent=4))
return Response(response)
except Exception as e:
print(e)
运行结果及报错内容
小程序报错:
python上有数据:
我的解答思路和尝试过的方法
是不是使用临时密钥和直接暴露密钥 // var cos = new COS({
//SecretId: 'AKID1sUpthEUUhyyhHIOYu2tTnqc7LJ1TeYCZfV',
//SecretKey: 'auwhFXYNxGI3YmlTu5zcy4tRjlWzB6mB',
// });
两者的上传方式不一样吗
我想要达到的结果
可以直接使用临时密钥上传对象
或者不使用密钥让我可以用上传的对象地址访问预览