使用Python Requests发送multipart/form-data上传证书失败求助
解决Nginx Proxy Manager API证书上传"No files were uploaded"报错问题
核心原因
Nginx Proxy Manager的/nginx/certificates/{certID}/upload端点要求严格遵循multipart/form-data格式,且每个证书字段必须以模拟文件对象的形式传递,参数名、内容包装方式稍有偏差就会触发该错误。
正确实现代码
import requests # 替换为你的实际配置 BASE_URL = "http://你的NPM实例地址:81" CERT_ID = "目标证书ID" API_TOKEN = "你的API令牌" # 字符串形式的证书内容 cert_str = "-----BEGIN CERTIFICATE-----\n...证书内容...\n-----END CERTIFICATE-----" key_str = "-----BEGIN PRIVATE KEY-----\n...私钥内容...\n-----END PRIVATE KEY-----" intermediate_str = "-----BEGIN CERTIFICATE-----\n...中间证书内容...\n-----END CERTIFICATE-----" # 构造符合要求的files参数 files = { "certificate": ("cert.pem", cert_str, "application/x-x509-ca-cert"), "certificate_key": ("key.pem", key_str, "application/pkcs8"), "intermediate_certificate": ("chain.pem", intermediate_str, "application/x-x509-ca-cert") } headers = { "Authorization": f"Bearer {API_TOKEN}" } # 发送请求(注意API路径需带/api前缀) response = requests.post( f"{BASE_URL}/api/nginx/certificates/{CERT_ID}/upload", headers=headers, files=files ) # 查看结果 print(response.status_code) print(response.json())
关键注意事项
- 参数名必须完全匹配:必须使用
certificate、certificate_key、intermediate_certificate,拼写错误直接导致服务端无法识别字段。 - 元组格式不能省:每个字段必须是
(文件名, 内容字符串, MIME类型)的三元组,文件名可任意填写但不能为空;MIME类型要对应证书类型,确保服务端正确解析。 - API路径前缀:NPM的API接口必须加上
/api前缀,遗漏会导致请求路径无效。 - 权限验证:确保API令牌拥有修改证书的权限,权限不足会返回其他错误,但当前报错优先排查格式问题。
排查技巧
- 先用Postman等工具手动测试上传,确认参数格式正确后再转成Python代码。
- 打印
requests生成的请求详情(如response.request.headers、response.request.body),检查multipart/form-data的边界和字段是否正确生成。 - 确认目标证书ID有效,无效ID可能引发异常。
内容的提问来源于stack exchange,提问作者MeCJay12
相关产品推荐
相关产品推荐

