如何用Python requests包通过form-data上传zip内的CSV并携带参数文件
Python复现POSTMAN form-data POST请求解决415错误
问题根源
- 手动设置Content-Type头:requests在处理
files参数时会自动生成带正确边界的multipart/form-data头,手动设置会导致边界不匹配,触发415错误。 - 字段名不匹配:需求要求的是
inputFile字段,你代码里用了archive,导致接口无法识别文件字段。 - 参数传递位置错误:JSON参数应该放在请求体的form-data中,而非URL查询参数(
params参数对应URL查询参数)。
修正后的代码
import requests # 仅保留必要请求头,移除手动设置的Content-Type import_headers = { 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Accept': '*/*', 'Authorization': f'Bearer {access_token}' } # 定义JSON参数对象 params_obj = { "mode": "CREATE_UPDATE", "encoding": "UTF-8", "format": { "separator": ";", "endOfLine": "\r\n", "enclosing": "\"", "escaping": "\"" }, "reportRecipients": [ "{emailAddress}" # 替换为实际邮箱地址 ] } # 使用with语句安全管理文件资源 with open(r'C:\{filePath}\test_undelimited_MKII.zip', 'rb') as zip_file: # 构造form-data字段:严格匹配需求的inputFile,同时添加JSON参数字段 form_data = { # 将JSON参数作为form-data项,指定Content-Type为application/json 'parameters': (None, params_obj, 'application/json'), # inputFile字段:指定文件名、文件对象、正确的Content-Type 'inputFile': ('test_undelimited_MKII.zip', zip_file, 'application/zip') } # 发送POST请求 response = requests.post(url, headers=import_headers, files=form_data) # 打印响应信息用于排查 print(f"状态码: {response.status_code}") print(f"响应内容: {response.text}")
关键说明
- 用
with语句打开文件,确保文件自动关闭,避免资源泄漏。 form_data中通过三元组定义字段:对于非文件字段(如JSON参数),格式为(文件名, 内容, Content-Type),文件名设为None即可;文件字段则传入文件名、文件对象和对应Content-Type。- 完全依赖requests自动生成
multipart/form-data头,避免手动设置导致的格式错误。
内容的提问来源于stack exchange,提问作者Daniel Miele
相关产品推荐
相关产品推荐

