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

 更新时间:2020年04月21日 15:12:14   作者:wan了个蛋  
这篇文章主要介绍了Python基于requests实现模拟上传文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

方法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字段(我们系统是这样,具体结合前端实际的字段为准),如图


2.字典value里面的对象:

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

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

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

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

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

  遇到的问题:

这个错误是说,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相关源码:

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

方法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())

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

相关文章

  • 利用LyScript实现应用层钩子扫描器

    利用LyScript实现应用层钩子扫描器

    Capstone 是一个轻量级的多平台、多架构的反汇编框架。本篇文章将运用LyScript插件结合Capstone反汇编引擎实现一个钩子扫描器,感兴趣的可以了解一下
    2022-08-08
  • 基于Python采集爬取微信公众号历史数据

    基于Python采集爬取微信公众号历史数据

    这篇文章主要介绍了基于Python采集爬取微信公众号历史数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Python3 串口接收与发送16进制数据包的实例

    Python3 串口接收与发送16进制数据包的实例

    今天小编就为大家分享一篇Python3 串口接收与发送16进制数据包的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 在Python中编写数据库模块的教程

    在Python中编写数据库模块的教程

    这篇文章主要介绍了在Python中编写数据库模块的教程,本文代码基于Python2.x版本,需要的朋友可以参考下
    2015-04-04
  • 使用Python创建LNK文件选择器并导出配置文件

    使用Python创建LNK文件选择器并导出配置文件

    在这篇博客中,我将介绍如何使用Python的wxPython库开发一个GUI应用程序,该应用程序可以选择文件夹中的.lnk(快捷方式)文件,并将选中的文件导出为特定格式的buttons.ini配置文件,需要的朋友可以参考下
    2025-01-01
  • python实现跨进程(跨py文件)通信示例

    python实现跨进程(跨py文件)通信示例

    本文主要介绍了python实现跨进程(跨py文件)通信示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Python 生成器yield原理及用法

    Python 生成器yield原理及用法

    这篇文章主要介绍了Python 生成器yield原理及用法,yield 是实现生成器方法之一,当函数使用yield方法,则该函数就成为了一个生成器,更多相关资料需要的小伙伴可以参考一下下面文章内容
    2022-06-06
  • 解决pycharm同一目录下无法import其他文件

    解决pycharm同一目录下无法import其他文件

    今天小编就为大家分享一篇解决pycharm同一目录下无法import其他文件,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 详解Selenium 元素定位和WebDriver常用方法

    详解Selenium 元素定位和WebDriver常用方法

    这篇文章主要介绍了详解Selenium 元素定位和WebDriver常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Python实现简易的图书管理系统

    Python实现简易的图书管理系统

    这篇文章主要为大家详细介绍了Python实现简易的图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论