有客自远方来52 2024-08-22 13:27 采纳率: 15.3%
浏览 4

为什么前端页面会返回桶名称格式错误

以下是我的代码,我想通过PYTHON代码和ajax请求往腾讯cos桶里面上传文件,但前端页面返回桶名称错误,我该如何解决?
PYTHON代码

def credential(bucket, region):
    """ 获取cos上传临时凭证 """

    config = {
        # 临时密钥有效时长,单位是秒(30分钟=1800秒)
        'duration_seconds': 5,
        # 固定密钥 id
        'secret_id': TENCENT_COS_ID,
        # 固定密钥 key
        'secret_key': TENCENT_COS_KEY,
        # 换成你的 bucket
        'bucket': bucket,
        # 换成 bucket 所在地区
        'region': region,
        # 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径
        # 例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
        'allow_prefix': '*',
        # 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
        'allow_actions': [
            # "name/cos:PutObject",
            # 'name/cos:PostObject',
            # 'name/cos:DeleteObject',
            # "name/cos:UploadPart",
            # "name/cos:UploadPartCopy",
            # "name/cos:CompleteMultipartUpload",
            # "name/cos:AbortMultipartUpload",
            "*",
        ],

    }

    sts = Sts(config)
    result_dict = sts.get_credential()
    return result_dict

def cos_credential(request, project_id):
    """ 获取cos上传临时凭证 """
    per_file_limit = request.tracer.price_policy.per_file_size * 1024 * 1024
    total_file_limit = request.tracer.price_policy.project_space * 1024 * 1024 * 1024

    total_size = 0
    file_list = json.loads(request.body.decode('utf-8'))
    for item in file_list:
        # 文件的字节大小 item['size'] = B
        # 单文件限制的大小 M
        # 超出限制
        if item['size'] > per_file_limit:
            msg = "单文件超出限制(最大{}M),文件:{},请升级套餐。".format(request.tracer.price_policy.per_file_size, item['name'])
            return JsonResponse({'status': False, 'error': msg})
        total_size += item['size']

        # 做容量限制:单文件 & 总容量

    # 总容量进行限制
    # request.tracer.price_policy.project_space  # 项目的允许的空间
    # request.tracer.project.use_space # 项目已使用的空间
    if request.tracer.project.use_space + total_size > total_file_limit:
        return JsonResponse({'status': False, 'error': "容量超过限制,请升级套餐。"})

    data_dict = credential(request.tracer.project.bucket, request.tracer.project.region)
    return JsonResponse({'status': True, 'data': data_dict})

HTML代码

var FOLDER_URL = '{% url 'file' project_id=request.tracer.project.id %}'
var FILE_DELETE_URL = '{% url 'file_delete' project_id=request.tracer.project.id %}'
var COS_CREDENTIAL = "{% url 'cos_credential' project_id=request.tracer.project.id %}";


$(function(){
    bindUploadFile();

});
function bindUploadFile() {
        $('#uploadFile').change(function () {

            var fileList = $(this)[0].files;
            // 获取本次要上传的每个文件名称&大小
            var checkFileList = [];
            $.each(fileList, function (index, fileObject) {
                checkFileList.push({'name': fileObject.name, 'size': fileObject.size})
            });

            // 把这些数据发送到django后台:Django后台进行容量的校验,如果没有问题则返回临时凭证;否则返回错误信息;
            var cos_credential = new COS({
                getAuthorization: function (options, callback) {
                    $.post(COS_CREDENTIAL, JSON.stringify(checkFileList), function (res) {

                        if (res.status) {
                            var credentials = res.data && res.data.credentials;
                            callback({
                                TmpSecretId: credentials.tmpSecretId,
                                TmpSecretKey: credentials.tmpSecretKey,
                                XCosSecurityToken: credentials.sessionToken,
                                StartTime: res.data.startTime,
                                ExpiredTime: res.data.expiredTime
                            });
                        } else {
                            alert(res.error);
                        }
                    });
                }
            });

            // 上传文件(上传之前先获取临时凭证)
            $.each(fileList, function (index, fileObject) {
                var fileName = fileObject.name;

                // 上传文件(异步)
                cos_credential.putObject({
                    Bucket: '{{ request.tracer.project.bucket }}', /* 必须 */
                    Region: '{{ request.tracer.project.region }}', /* 存储桶所在地域,必须字段 */
                    Key: fileName, /* 必须 */
                    Body: fileObject, // 上传文件对象
                    onProgress: function (progressData) {
                        console.log("文件上传进度---->",fileName,JSON.stringify(progressData));
                    }
                }, function (err, data) {
                    console.log(err || data);
            });
        })
    });
}

页面错误

file/:334 Error: Bucket should format as "test-1250000000".

  • 写回答

1条回答 默认 最新

  • 吃不了席 2024-08-22 18:13
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的代码,问题可能出在前端HTML代码中的Bucket名称。请确保Bucket名称的格式正确,即以"test-"开头,后面跟着一串数字。您可以检查一下{{ request.tracer.project.bucket }}这个变量的值是否符合腾讯COS桶命名规范。

    如果Bucket名称格式正确,那么问题可能出在后端Python代码中。您可以尝试在credential函数中打印出config字典,以确保其中的bucket值是正确的。如果仍然无法解决问题,请检查您的腾讯COS SDK是否正确配置和使用。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月22日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?