使用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
相关产品推荐
相关产品推荐

