Python用预签名URL以multipart/formdata POST上传MINIO遇凭证错误
Minio POST上传凭证格式错误解决方案
1. 修复x-amz-credential格式
错误提示明确要求凭证格式为 <AccessKeyID>/YYYYMMDD/区域/minio/aws4_request,注意Minio的服务标识是minio而非s3。
- 核对你的
<cred>值,必须严格遵循该结构,示例:AKIAXXXXXXX/20230111/us-east-1/minio/aws4_request
2. 修正请求参数传递逻辑
你的代码存在参数传递冲突问题,需调整为正确的multipart/formdata提交方式:
import json import requests # 确保所有form参数格式正确 form_data = { 'policy': '<Base64编码的Policy字符串>', 'x-amz-algorithm': 'AWS4-HMAC-SHA256', 'x-amz-credential': '<符合格式的凭证>', 'x-amz-date': '20230111T110342Z', 'x-amz-signature': '<签名值>', 'bucket': 'temp', 'key': 'object.txt', } # 仅定义文件字段,避免冗余参数 files = { 'file': ('a.txt', open('a.txt', 'rb'), 'application/octet-stream') } # 正确发送请求:form参数通过data传递,文件通过files传递 response = requests.post('https://<minio_url>/temp/', data=form_data, files=files, verify=False) print(response.status_code) print(response.text)
3. 验证预签名Policy的有效性
Policy是POST上传的核心控制项,需满足:
- 必须包含
content-length-range条件来限制上传文件大小,示例条件:["content-length-range", 0, 10485760](限制最大10MB) - Policy需经过Base64编码后作为
policy参数值 expiration过期时间必须晚于当前请求时间conditions中的所有项需与form参数完全匹配(如bucket、key、日期、算法等)
示例未编码的Policy模板:
{ "expiration": "2023-01-12T11:03:42Z", "conditions": [ {"bucket": "temp"}, {"key": "object.txt"}, {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, {"x-amz-credential": "AKIAXXXXXXX/20230111/us-east-1/minio/aws4_request"}, {"x-amz-date": "20230111T110342Z"}, ["content-length-range", 0, 10485760] ] }
4. 额外检查项
- 确认Minio服务器配置的区域与凭证中的区域完全一致
x-amz-algorithm必须固定为AWS4-HMAC-SHA256- 移除所有多余的请求字段(如原代码中的
json字段),避免干扰签名验证
内容的提问来源于stack exchange,提问作者Amit Krishna A
相关产品推荐
相关产品推荐

