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从sqlite读取并显示数据的方法
May 08 Python
python实现实时监控文件的方法
Aug 26 Python
Python性能提升之延迟初始化
Dec 04 Python
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
Python实现简单遗传算法(SGA)
Jan 29 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
Python实现E-Mail收集插件实例教程
Feb 06 Python
Python判断对象是否为文件对象(file object)的三种方法示例
Apr 26 Python
Python selenium自动化测试模型图解
Apr 15 Python
python3中布局背景颜色代码分析
Dec 01 Python
在python中对于bool布尔值的取反操作
Dec 11 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
一个简洁的多级别论坛
2006/10/09 PHP
php 函数使用方法与函数定义方法
2010/05/09 PHP
php 注册时输入信息验证器的实现详解
2013/07/05 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
PHP实现的简单sha1加密功能示例
2017/08/27 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
javascript计时器详解
2015/02/28 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
vuejs简单验证码功能完整示例
2019/01/08 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
python搭建简易服务器分析与实现
2012/12/15 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
python如何让类支持比较运算
2018/03/20 Python
Python下简易的单例模式详解
2019/04/08 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
Django组件cookie与session的具体使用
2019/06/05 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
介绍信格式
2015/01/30 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
小学音乐课教学反思
2016/02/18 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android