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标准库之多进程(multiprocessing包)介绍
Nov 25 Python
python获取各操作系统硬件信息的方法
Jun 03 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
python数字图像处理实现直方图与均衡化
May 04 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
Jul 27 Python
python实现决策树分类(2)
Aug 30 Python
详解Python locals()的陷阱
Mar 26 Python
Python正则表达式匹配日期与时间的方法
Jul 07 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
Sep 16 Python
在终端启动Python时报错的解决方案
Nov 20 Python
解决Python中的modf()函数取小数部分不准确问题
May 28 Python
Python可视化学习之matplotlib内置单颜色
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实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
CentOS 6.3下安装PHP xcache扩展模块笔记
2014/09/10 PHP
JS backgroundImage控制
2009/05/19 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
AngularJS实现表单验证
2015/01/28 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
Go语言基于Socket编写服务器端与客户端通信的实例
2016/02/19 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
关于PyTorch 自动求导机制详解
2019/08/18 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
中科创达面试题
2016/12/28 面试题
技术人员面试提纲
2013/11/28 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
卖房协议书样本
2014/10/30 职场文书
2014年终工作总结范本
2014/12/15 职场文书
停电通知范文
2015/04/16 职场文书
离婚律师函范本
2015/05/27 职场文书