python MultipartEncoder传输zip文件实例
作者:Showjy 发布时间:2022-04-20 07:22:57
标签:python,MultipartEncoder,zip
需求:对方提供处理文件的接口,本地将待处理文件压缩后,通过http post multipart方式上传,等待处理完成后从相应连接下载结果
代码:
import os
import time
import zipfile
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
class Func4Fuxi(object):
def __init__(self):
self.remote_result = 0
# 压缩文件
def zip_dir(self, dirname, zipfilename):
filelist = []
if os.path.isfile(dirname):
filelist.append(dirname)
else:
for root, dirs, files in os.walk(dirname):
for name in files:
filelist.append(os.path.join(root, name))
zf = zipfile.ZipFile(zipfilename, mode="w", compression=zipfile.zlib.DEFLATED, allowZip64=True)
for tar in filelist:
arcname = tar[len(dirname):]
zf.write(tar, arcname)
zf.close()
# 解压文件
def unzip_file(self, zipfilename, unziptodir):
if not os.path.exists(unziptodir):
os.mkdir(unziptodir)
zfobj = zipfile.ZipFile(zipfilename)
for name in zfobj.namelist():
name = name.replace('\\', '/')
if name.endswith('/'):
os.mkdir(os.path.join(unziptodir, name))
else:
ext_filename = os.path.join(unziptodir, name)
ext_dir = os.path.dirname(ext_filename)
if not os.path.exists(ext_dir):
os.mkdir(ext_dir)
outfile = open(ext_filename, 'wb')
outfile.write(zfobj.read(name))
outfile.close()
# 下载
def download_result(self, filename):
filename.replace('\\', '/')
file = filename.split('/')[-1]
URL = '--------------'
re = requests.get(URL+'?name='+file, stream=True)
self.remote_result = re.status_code
if self.remote_result == 200:
print("find result,try to download")
f = open("download_"+file, "wb")
for chunk in re.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
print("download result success")
return self.remote_result
# 上传
def upload_zip(self, filename):
self.remote_result = 0
filename.replace('\\', '/')
file = filename.split('/')[-1]
file_tup = (file, open(filename, 'rb'), 'application/zip')
URL = '-----------------'
#fields属性根据对方接口说明设置
m = MultipartEncoder(
fields={'name': file, 'zipfile': file_tup}
)
re = requests.post(URL, data=m, headers={'Content-Type': m.content_type})
self.remote_result = re.status_code
if self.remote_result == 200:
print("upload success")
else:
print("upload failed")
return self.remote_result
补充知识:Python模拟浏览器上传文件脚本(Multipart/form-data格式)
http协议本身的原始方法不支持multipart/form-data请求,这个请求由原始方法演变而来的。
multipart/form-data的基础方法是post,也就是说是由post方法来组合实现的,与post方法的不同之处:请求头,请求体。
multipart/form-data的请求头必须包含一个特殊的头信息:
Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容自然需要分割开来,不然接收方就无法正常解析和还原这个文件了。
具体的头信息如下:
Content-Type: multipart/form-data; boundary=${bound}
实例:
import os, random, sys, requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
url = 'http://127.0.0.1/sendmsg'
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={
'username': argv_dict['username'],
'pwd': argv_dict['pwd'],
'type': 'txt',
'friendfield': argv_dict['friendfield'],
'friend': argv_dict['friend'],
'content': argv_dict['content'],
'file': (os.path.basename(argv_dict['file']) , open(argv_dict['file'], 'rb'), 'application/octet-stream')
#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等其他参数,否则会报错
# 例子/usr/local/python36/bin/python3 /opt/lykchat/test_upload.py "{'username':'lykchat','pwd':'123456','type':'img','friendfield':'1','friend':'xxxx','content':'恭喜发财','file':'/root/b.jpg'}"
#等同于curl -F "file=@/root/a" 'http://127.0.0.1/sendmsg?username=lykchat&pwd=123456&type=img&friendfield=1&friend=xxxx&content=恭喜发财'
来源:https://blog.csdn.net/Show_Jia/article/details/102847288


猜你喜欢
- 本文实例讲述了python通过apply使用元祖和列表调用函数的方法。分享给大家供大家参考。具体实现方法如下:def my_fuc(a, b
- 最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定
- 本文实例讲述了go语言使用pipe读取子进程标准输出的方法。分享给大家供大家参考。具体如下:其核心代码如下:cmd := exec.Comm
- 这次做一个比较贴近我实际的东西:python分析作业提交情况。要求: 将服务器中交作业的学生(
- 今天简单使用了一下python的re模块和lxml模块,分别利用的它们提供的正则表达式和xpath来解析页面源码从中提取所需的title,x
- 我们将在下面的例子中使用这个 XML 文档。<?xml version="1.0" encod
- 1 sample(序列a,n)sample(序列a,n)功能:从序列a中随机抽取n个元素,并将n个元素生以list形式返回。例:from r
- 1. 从字典创建DataFrame>>> import pandas>>> dict_a = {'
- 最近github上开源了一个"新语言"vlang,火的不得了,我不信,于是乎,尝试了一下,真香。以下内存均来自https
- 看lifesinger的《由Kimi找茬想到的》,我想到的:1、 我不同意将“合并付款”定调在“很多卖家都需要”。这个“很多”在卖家里面大概
- 从一个字符串开始在CODE上查看代码片派生到我的代码片 >>>time_str='2008-08-08
- 密码学俱乐部的第一条规则是:永远不要自己发明密码系统。密码学俱乐部的第二条规则是:永远不要自己实现密码系统:在现实世界中,在实现以及设计密码
- 若对于同一数据库实例中的两个数据库进行同步则直接对数据库表创建Trigger。SQL Server 2005的联机帮助:Trigger on
- Pandas中根据列的值选取多行数据 # 选取等于某些值的行记录 用 == df.loc[df['column_name']
- Pygame是一个超好用的SDL绑定。自从有了Pygame,妈妈再也不用担心我内存泄漏了。但是这里有一个问题,Pygame的Movie模块已
- 引言知乎上有个热门问题,Python 未来会成为大众办公常用编程工具吗?在编程世界里,Python已经是名副其实的网红了。曾经一个学汉语言的
- sql语句查询重复的数据查找所有重复标题的记录:SELECT *FROM t_info aWHERE ((SELECT COUNT(*)FR
- //有1-22个文件夹,各文件夹下有Detect_0文件夹,此文件夹下有source与mask文件夹,目的是将需要获取图片的文件夹下的图片复
- Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它
- Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升