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 捕获shell脚本的输出结果实例
Jan 04 Python
python 性能优化方法小结
Mar 31 Python
Python中的单继承与多继承实例分析
May 10 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
python将视频转换为全字符视频
Apr 26 Python
Django REST framework 分页的实现代码
Jun 19 Python
Python 实现Numpy中找出array中最大值所对应的行和列
Nov 26 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
Python气泡提示与标签的实现
Apr 01 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
详解Python中的文件操作
Jan 14 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
js querySelector() 使用方法
2016/12/21 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
vue2.0 实现页面导航提示引导的方法
2018/03/13 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
JSON.stringify()方法讲解
2019/01/31 Javascript
javascript实现滚动条效果
2020/03/24 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
Python计算三维矢量幅度的方法
2015/06/15 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
Python中如何获取类属性的列表
2016/12/26 Python
win10下python3.5.2和tensorflow安装环境搭建教程
2018/09/19 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
物业管理员岗位职责范文
2013/11/25 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
大学感恩节活动总结
2015/05/05 职场文书
小型婚礼主持词
2015/06/30 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
python如何做代码性能分析
2021/04/26 Python
如何正确理解python装饰器
2021/06/15 Python
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang