python MultipartEncoder传输zip文件实例


Posted in Python onApril 07, 2020

需求:对方提供处理文件的接口,本地将待处理文件压缩后,通过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=恭喜发财'

以上这篇python MultipartEncoder传输zip文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python类参数self使用示例
Feb 17 Python
Python中无限元素列表的实现方法
Aug 18 Python
kNN算法python实现和简单数字识别的方法
Nov 18 Python
Python实现简单的可逆加密程序实例
Mar 05 Python
Python实现控制台输入密码的方法
May 29 Python
python抓取并保存html页面时乱码问题的解决方法
Jul 01 Python
Python温度转换实例分析
Jan 17 Python
TensorFlow saver指定变量的存取
Mar 10 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
python+opencv像素的加减和加权操作的实现
Jul 14 Python
python scipy卷积运算的实现方法
Sep 16 Python
python numpy--数组的组合和分割实例
Feb 24 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
Apr 07 #Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 #Python
Django Xadmin多对多字段过滤实例
Apr 07 #Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
Apr 07 #Python
解决Python中报错TypeError: must be str, not bytes问题
Apr 07 #Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 #Python
django 实现简单的插入视频
Apr 07 #Python
You might like
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
js转html实体的方法
2016/09/27 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
详细解析Python中的变量的数据类型
2015/05/13 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Python类的动态绑定实现原理
2020/03/21 Python
Jogun Shop中文官网:韩国知名时尚男装网站
2016/10/12 全球购物
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
匡威西班牙官网:Converse西班牙
2019/10/01 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
数据库面试要点基本概念
2013/10/31 面试题
社区娱乐活动方案
2014/08/21 职场文书
二审代理词范文
2015/05/25 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
Python基础知识之变量的详解
2021/04/14 Python
Redis性能监控的实现
2021/07/09 Redis
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js