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 相关文章推荐
Django中login_required装饰器的深入介绍
Nov 24 Python
Python 中Pickle库的使用详解
Feb 24 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
对python指数、幂数拟合curve_fit详解
Dec 29 Python
python利用re,bs4,requests模块获取股票数据
Jul 29 Python
Python模块_PyLibTiff读取tif文件的实例
Jan 13 Python
Python函数的迭代器与生成器的示例代码
Jun 18 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
python简单利用字典破解zip文件口令
Sep 07 Python
Pandas数据分析的一些常用小技巧
Feb 07 Python
linux中nohup和后台运行进程查看及终止
Jun 24 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 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
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
PHP 柱状图实现代码
2009/12/04 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
对numpy中array和asarray的区别详解
2018/04/17 Python
python 产生token及token验证的方法
2018/12/26 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
海淘母婴商城:国际妈咪
2016/07/23 全球购物
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
教育课题研究自我鉴定范文
2013/12/28 职场文书
11月红领巾广播稿
2014/01/17 职场文书
职业规划实施方案
2014/06/10 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
初中政治教学工作总结
2015/08/13 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
Python中基础数据类型 set集合知识点总结
2021/08/02 Python
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL
基于Redission的分布式锁实战
2022/08/14 Redis