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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:20:30