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 相关文章推荐
安装ElasticSearch搜索工具并配置Python驱动的方法
Dec 22 Python
Python实现的生成格雷码功能示例
Jan 24 Python
新手常见6种的python报错及解决方法
Mar 09 Python
selenium+python实现自动登录脚本
Apr 22 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
Python实现决策树C4.5算法的示例
May 30 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
Nov 02 Python
Python基础之Socket通信原理
Apr 22 Python
Python语言内置数据类型
Feb 24 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
php array_slice函数的使用以及参数详解
2008/08/30 PHP
php单件模式结合命令链模式使用说明
2008/09/07 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
vue slots 组件的组合/分发实例
2018/09/06 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
python元组操作实例解析
2014/09/23 Python
在Python下尝试多线程编程
2015/04/28 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
python tkinter组件摆放方式详解
2019/09/16 Python
pygame实现非图片按钮效果
2019/10/29 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
美国五金商店:Ace Hardware
2018/03/27 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
房产代理公证处委托书
2014/04/04 职场文书
市场部经理岗位职责
2014/04/10 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
酒店员工手册范本
2015/05/14 职场文书
企业团队精神心得体会
2016/01/19 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript