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 相关文章推荐
python实现图片变亮或者变暗的方法
Jun 01 Python
Python之str操作方法(详解)
Jun 19 Python
python决策树之CART分类回归树详解
Dec 20 Python
Python 元类实例解析
Apr 04 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
Aug 23 Python
python输出数学符号实例
May 11 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
Python 防止死锁的方法
Jul 29 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
基于PyTorch中view的用法说明
Mar 03 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_flip() 删除数组重复元素
2009/01/14 PHP
php-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
js 匿名调用实现代码
2009/06/19 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
jquery validate demo 基础
2015/10/29 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
书单|人生苦短,你还不用python!
2017/12/29 Python
python分布式计算dispy的使用详解
2019/12/22 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
python 实现IP子网计算
2021/02/18 Python
汽车检测与维修个人求职信
2013/09/24 职场文书
大一新生军训时的自我评价分享
2013/12/05 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
农业项目合作意向书
2015/05/08 职场文书
经费申请报告
2015/05/15 职场文书
杨善洲电影观后感
2015/06/04 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
Python面向对象之内置函数相关知识总结
2021/06/24 Python
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL
Redis+AOP+自定义注解实现限流
2022/06/28 Redis