因为业务需要,需要模拟浏览器上传多个文件到网站平台,然后网上查了一大堆关于python的post上传操作。发现没有匹配操作。
这里就做个python关于requests的post请求,发送多文件、多参数的from-data操作。
from request_toolbelt.multipart.encoder import MultipartEncoder
import requests
import os
def upload_files():
num1 = 'a'
num2 = 'b'
files = 【file1,file2,file3】
data =【("参数1",num1),("参数2",num2)】
for file in files:
name = os.path.basename(file)
data2 = (name,open(file, 'rb'), '文件类型')
file_list = 【('file_name', name), ('file_data',data2)】
data.extend(file_list)
mu = MultipartEncoder(data, boundary='.....')
url = '....'
resp = requests.post(url, data = mu, headers= ...)
#从headers中提取boundary信息
需要注意的是boundary参数,这个参数要跟header头中定义的一样,否则会出问题。否则会出问题,否则会出问题。重要事情说三遍。
headers = {
'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
'cache-control': "no-cache",
}
转化后的data form-data字符串为:
 
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name=“参数1”
a
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name=“参数2”
b
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name=“file_name”
对应的name内容
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name=“file_data”;filename=为上面data2中的name内容
content-Type: …
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name=“为上面fir循环中的第二个name名”
…
------WebKitFormBoundary7MA4YWxkTrZu0gW–
…
主要的点是把参数部分调成 列表合适 然后里面嵌套 是元祖类型
再