Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)

最近有个需求需要通过模拟浏览器Multipart/form-data格式来向服务器POST上传文件,考虑到用python会方便点

Multipart/form-data简介

Multipart/form-data的基础方法是POST , 也就是说是由POST方法来组合实现的.
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
分享
二维码