以下是我的代码,我想通过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".