Python基于requests实现模拟上传文件


Posted in Python onApril 21, 2020

方法1:

1.安装requests_toolbelt依赖库

#代码实现
def upload(self):
    login_token = self.token.loadTokenList()
    for token in login_token:
      tempPassword_url = self.config['crm_test_api']+'/document/upload'
      tempPassword_data = self.data_to_str.strToDict('''title:1.png
      course_name_id:63
      course_id:1112
      desc:7
      doc_type:1
      is_public:1''',value_type='str')
      files={'file': ('1.png', open('C:\\Users\\Acer\\Pictures\\Screenshots\\1.png', 'rb'), 'image/png')}
      tempPassword_data.update(files)
      m = MultipartEncoder(
        fields=tempPassword_data
      )
      tempPassword_headers = {"Content-Type": m.content_type, "token": token}
      tempPassword_request = requests.post(url=tempPassword_url,data=m,headers=tempPassword_headers)
      print(tempPassword_request.content)

2.组装MultipartEncoder对象需要的参数:将tempPassword_data的字段合并至files

1.files参数介绍:

1.字典key对应file字段(我们系统是这样,具体结合前端实际的字段为准),如图

Python基于requests实现模拟上传文件

2.字典value里面的对象:

1.filename(服务器最终存储的文件名)

2.filepath(具体的文件路径,注意转义),文件是以二进制的形式进行传输的,所以这里传输时以二进制的形式打开文件并传输

3.content_type:具体结合前端实际的字段为准:一般可定义为: 文本(text)/图片(image)等[/code][code]

3.tempPassword_data:为文件上传时的附带参数

strToDict方法:自己手写的一个字符串转dict的方法

遇到的问题:

Python基于requests实现模拟上传文件

这个错误是说,int对象不能被编码,所以需要手动将int对象转换为str,所以我在此方法中定义了value_type这个参数,用于将字典中的所有value转换为str类型

#具体代码实现,仅供参考
def strToDict(str_in,value_type=None):
    # value_type:转换字典的value为指定的类型,未防止异常,目前仅支持str
    # '''将str转换为dict输出'''
    # '''将带有time关键字的参数放到字符串末尾'''
    # print(str_in)
    if str_in:
      match_str = ':'
      split_str = '\n'
      split_list = str_in.split(split_str)
      str_in_dict = {}
      for i in split_list:
        colon_str_index = i.find(match_str)
        if colon_str_index == -1:
          # '''处理firefox复制出来的参数'''
          match_str = '\t' or ' '
          colon_str_index = i.find(match_str)
        # '''去掉key、value的空格,key中的引号'''
        str_in_key = i[:colon_str_index].strip()
        str_in_key = str_in_key.replace('"','')
        str_in_key = str_in_key.replace("'",'')
        # 正则过滤无用key,只保留key第一位为字母数据获取[]_
        str_sign = re.search('[^a-zA-Z0-9\_\[\]+]', str_in_key[0])
        if str_sign is None:
          # 处理value中的空格与转义符
          str_in_value = i[colon_str_index + 1:].strip()
          str_in_value=str_in_value.replace('\\','')
          try:
            # 遇到是object类型的数据转换一下
            str_in_value=eval(str_in_value)
          except BaseException as error:
            str_in_value=str_in_value
          if value_type in ['str','string']:
            str_in_value=str(str_in_value)
          else:
            str_in_value=str_in_value
          str_in_dict[str_in_key] = str_in_value
      return str_in_dict
    else:
      print("参数都没有,还处理个球嘛")
      return None

3.请求时将headers的content设置为m.content_type,会设置headers的content_type为form—data,类型为str:

MultipartEncoder相关源码:

Python基于requests实现模拟上传文件

Python基于requests实现模拟上传文件

4.请求时设置data为m,会输出一个MultipartEncoder对象:

Python基于requests实现模拟上传文件

方法2:

直接使用requests,无需依赖requests_toolbelt库

过程大同小异,也是需要将字典的value转换为str

注意:headers不要传content_type字段,headers不要传content_type字段,headers不要传content_type字段

请求时:data对应附加参数,files对应files对象

#相关代码
def upload(self):
    login_token = self.token.loadTokenList()
    for token in login_token:
      tempPassword_url = self.config['crm_test_api']+'/document/upload'
      tempPassword_data = self.data_to_str.strToDict('''title:1.png
      course_name_id:63
      course_id:1112
      desc:7
      doc_type:1
      is_public:1''',value_type='str')
      files={'file': ('1.png', open('C:\\Users\\Acer\\Pictures\\Screenshots\\1.png', 'rb'), 'image/png')}
      tempPassword_headers = {"token": token}
      tempPassword_request = requests.post(url=tempPassword_url,data=tempPassword_data,files=files,headers=tempPassword_headers)
      print(tempPassword_request.json())

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
网站渗透常用Python小脚本查询同ip网站
May 08 Python
python select.select模块通信全过程解析
Sep 20 Python
pandas使用apply多列生成一列数据的实例
Nov 28 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
django最快程序开发流程详解
Jul 19 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
Apr 26 Python
Python3.9新特性详解
Oct 10 Python
python编程的核心知识点总结
Feb 08 Python
在Windows下安装配置CPU版的PyTorch的方法
Apr 02 Python
python基于opencv批量生成验证码的示例
Apr 28 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 #Python
基于jupyter代码无法在pycharm中运行的解决方法
Apr 21 #Python
如何基于python对接钉钉并获取access_token
Apr 21 #Python
python用TensorFlow做图像识别的实现
Apr 21 #Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 #Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 #Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 #Python
You might like
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
JavaScript中获取样式的原生方法小结
2014/10/08 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
js实现表格数据搜索
2020/08/09 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
基于python使用tibco ems代码实例
2019/12/20 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
运动会邀请函范文
2014/02/06 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
小鞋子观后感
2015/06/05 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
读完《骆驼祥子》的观后感!
2019/07/05 职场文书
大学生奖学金获奖感言(范文)
2019/08/15 职场文书
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis