Python中如何将Postman模拟的文件上传功能改为Python代码,但上传空文件报错
import requests
url = “http://yk-project.dev.ethercap.com/report/add"
querystring = {”_":“1111111”}
payload = “------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=”_csrf"\r\n\r\nBr0949bZlNP4o4iGtNkbE1uE6XU903CqrI9ZnZRQzJF_zEi0n-_g5Zmay_T7qkNYPbbdGVGGRtzA6Qn15Rae6A==\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=“ReportForm[url]”; filename=“齐家网 COO 毛新勇:《未来平台赋能是必然,但要真刀真枪才有意义》-18 页.pdf”\r\nContent-Type: application/pdf\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW–“
headers = {
‘content-type’: “multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW”,
‘User-Agent’: “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36”,
‘Cookie’: “u=400; PHPSESSID=dfc4ac95c5c485a49ec167febc0b2da6; csrf=0226ebc29a0710864db49376b6c400a3895ce0dbfb7161dc3d08e5bc8d148386a%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%22aoSW7OAr9i2rwVb2H7Khty6qSimxBUMn%22%3B%7D",
‘Cache-Control’: “no-cache”,
‘Postman-Token’: “64fd1e6e-e442-4161-b32e-110c6627ee23”
}
response = requests.request(“POST”, url, data=payload, headers=headers, params=querystring)
print(response.text)
自己复制后改成下列形式 我写绝对路径和相对路径都报错空文件,请指教,这是为啥? 完全复制 postman 的
url = “http://yk-project.dev.ethercap.com/report/add”
querystring = {"”: “1111111”}
payload = “------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=”_csrf”\r\n\r\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=“ReportForm[url]”; filename="{}"\r\nContent-Type: application/pdf\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW–".format(csrf_token,‘麦肯锡中国银行业 CEO 季刊-2018 年冬季刊精简版-137 页.pdf’)
print(payload.encode(‘utf-8’))
headers = {
‘content-type’: “multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW”,
‘User-Agent’: “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36”,
‘Cookie’: “u=400; PHPSESSID=dfc4ac95c5c485a49ec167febc0b2da6; _csrf=0226ebc29a0710864db49376b6c400a3895ce0dbfb7161dc3d08e5bc8d148386a%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%22aoSW7OAr9i2rwVb2H7Khty6qSimxBUMn%22%3B%7D”,
‘Cache-Control’: “no-cache”,
‘Postman-Token’: “64fd1e6e-e442-4161-b32e-110c6627ee23”
}
response = requests.request(“POST”, url, data=payload.encode(‘utf-8’), headers=headers, params=querystring)
Python中如何将Postman模拟的文件上传功能改为Python代码,但上传空文件报错
我遇到过类似问题,Postman里文件上传正常,但用Python的requests库上传空文件就报错。核心原因是Postman和requests处理空文件的方式不同。
Postman发送空文件时,实际上还是会包含一个文件字段,只是内容为空。而Python的requests库中,如果你传一个空文件对象或None,它可能不会正确处理这个字段。
这是正确的代码示例:
import requests
url = 'http://your-api-endpoint.com/upload'
files = {'file': ('filename.txt', open('empty_file.txt', 'rb'), 'text/plain')}
# 即使empty_file.txt是空文件,这样也能正确上传
response = requests.post(url, files=files)
print(response.status_code)
关键点:
- 必须使用二进制模式打开文件(‘rb’),即使文件是空的
- 元组格式是:(文件名, 文件对象, MIME类型)
- 即使文件内容为空,文件对象也不是None
如果文件路径可能为空,需要这样处理:
import requests
from io import BytesIO
url = 'http://your-api-endpoint.com/upload'
# 方法1:创建空的BytesIO对象模拟空文件
empty_file = BytesIO(b'')
files = {'file': ('empty.txt', empty_file, 'text/plain')}
# 方法2:如果文件路径存在就传文件,不存在就传空
file_path = 'possibly_empty.txt'
try:
with open(file_path, 'rb') as f:
files = {'file': (file_path, f, 'text/plain')}
except FileNotFoundError:
files = {'file': ('empty.txt', BytesIO(b''), 'text/plain')}
response = requests.post(url, files=files)
常见错误:
- 直接传
None:files={'file': None}❌ - 传空字符串:
files={'file': ''}❌ - 忘记二进制模式:
open('file.txt', 'r')❌
总结:用BytesIO处理空文件最稳妥。
报错日志在哪? 你这么问谁知道啥问题?

