Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
最近有个需求需要通过模拟浏览器Multipart/form-data格式来向服务器POST上传文件,考虑到用python会方便点
Multipart/form-data简介
Multipart/form-data的基础方法是POST , 也就是说是由POST方法来组合实现的.
Multipart/form-data与POST方法的不同之处在于请求头和请求体.
Multipart/form-data的请求头必须包含一个特殊的头信息 :
Multipart/form-data的请求体也是一个字符串 , 不过和post的请求体不同的是它的构造方式 , post是简单的name=value值连接 , 而Multipart/form-data则是添加了分隔符等内容的构造体.
Multipart/form-data与POST方法的不同之处在于请求头和请求体.
Multipart/form-data的请求头必须包含一个特殊的头信息 :
Content-Type
, 且其值也必须规定为multipart/form-data
, 同时还需要规定一个内容分割符用于分割请求体中的多个POST的内容 , 如文件内容和文本内容自然需要分割开来 , 不然接收方就无法正常解析和还原这个文件了.Multipart/form-data的请求体也是一个字符串 , 不过和post的请求体不同的是它的构造方式 , post是简单的name=value值连接 , 而Multipart/form-data则是添加了分隔符等内容的构造体.
请求的头部信息如下:
Content-Type: multipart/form-data; boundary=你的自定义boundary
boundary
这个参数是分界线的意思 , 也就是说你在请求头中指定分界线为: 盖了帽了我的老baby , 那么请求体中凡是 盖了帽了我的老baby 这样的字段都会被视为分界线 , 这个分界线参数具体是什么你可以随意自定义 , 这只是举个例子 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 你如果要用也可以 , 建议设置的复杂一些 避免和请求体中其他字段发生重复的现象.
参考代码(1)
import os, random, sys, requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
url = 'http://127.0.0.1/upload' #post目标地址
argvstr = sys.argv[1:]
argv_dict = {}
for argv in argvstr :
argv = str(argv).replace("\r\n" , "")
DICT = eval(argv)
argv_dict.update(DICT) #解析外部传参
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0',
'Referer': url
}
multipart_encoder = MultipartEncoder(
fields={
'file': (os.path.basename(argv_dict['file']) , open(argv_dict['file'], 'rb'), 'application/octet-stream')
#argv_dict['file']为传参的文件路径
},
boundary='-----------------------------' + str(random.randint(1e28, 1e29 - 1)) #分界线
)
headers['Content-Type'] = multipart_encoder.content_type
#请求头必须包含一个特殊的头信息,类似于Content-Type: multipart/form-data; boundary=${bound}
r = requests.post(url, data=multipart_encoder, headers=headers)
print(r.text)
#注意,不要设置cookies等其他参数,否则会报错
# 调用例子 python /root/upload.py "{'file':'/root/b.jpg'}"
THE END
二维码
D
看不了