You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用boto3生成预签名Post时遇AttributeError错误求助

解决boto3预签名Post的AttributeError问题

这个错误的根源非常清晰——你给Conditions参数传了一个字典(dict),但boto3的generate_presigned_post方法要求Conditions必须是一个列表(list)。当方法内部尝试对这个参数调用append方法时,字典自然没有这个属性,所以抛出了AttributeError: 'dict' object has no attribute 'append'。

修正后的代码

只需要把conditions从字典改成列表,每个条件作为列表里的独立元素即可:

key = str(venuepk) + '/' + str(samplemenuid) + '/${filename}'
fields = {'acl': 'public-read', 'content-type': 'application/PDF'}
# 将Conditions改为列表,每个条件是单独的字典
conditions = [
    {'acl': 'public-read'},
    {'content-type': 'application/PDF'}
]
s3 = boto3.client('s3')
post = s3.generate_presigned_post(
    Bucket=AWS_UPLOAD_BUCKET,
    Key=key,
    Fields=fields,
    Conditions=conditions
)
return Response({
    'url': post['url'],
    'fields': post['fields'],
    'samplemenupk': samplemenuid  # 补全你原本的变量
})

额外说明

  • Fields参数确实是字典类型,你原来的写法没问题,它用来定义要包含在表单里的固定字段和值。
  • Conditions列表除了字典形式的匹配条件,还可以加入其他类型的规则,比如限制上传文件的大小:
    conditions = [
        {'acl': 'public-read'},
        {'content-type': 'application/PDF'},
        ['content-length-range', 0, 10485760]  # 限制最大10MB
    ]
    
  • 你代码里的${filename}写法是正确的,它会保留用户上传文件的原始文件名,最终S3对象的键会是venuepk/samplemenuid/原始文件名。

内容的提问来源于stack exchange,提问作者user9487981

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:14:09