weixin_51250310 2022-03-11 10:14 采纳率: 37.5%
浏览 67

微信小程序借助腾讯云对象存储上传图片,使用临时密钥上传

问题遇到的现象和发生背景

在使用腾讯云对象存储的时候用测试方法暴露了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)

运行结果及报错内容

小程序报错:

img


python上有数据:

img

我的解答思路和尝试过的方法

是不是使用临时密钥和直接暴露密钥 // var cos = new COS({
//SecretId: 'AKID1sUpthEUUhyyhHIOYu2tTnqc7LJ1TeYCZfV',
//SecretKey: 'auwhFXYNxGI3YmlTu5zcy4tRjlWzB6mB',
// });
两者的上传方式不一样吗

我想要达到的结果

可以直接使用临时密钥上传对象
或者不使用密钥让我可以用上传的对象地址访问预览

  • 写回答

1条回答 默认 最新

  • 崽崽的谷雨 2022-03-11 10:43
    关注

    403可能没有权限,或者传参有误 。
    大概率 密钥 传的不对

    评论

报告相同问题?

问题事件

  • 创建了问题 3月11日

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料