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备份Mysql脚本
Aug 11 Python
Python打印scrapy蜘蛛抓取树结构的方法
Apr 08 Python
Python获取任意xml节点值的方法
May 05 Python
分享python数据统计的一些小技巧
Jul 21 Python
深入理解python中的atexit模块
Mar 07 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
python批量图片处理简单示例
Aug 06 Python
Python使用Numpy模块读取文件并绘制图片
May 13 Python
基于python实现破解滑动验证码过程解析
May 28 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
Python的scikit-image模块实例讲解
Dec 30 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使用Redis长连接的方法详解
2018/02/12 PHP
prototype 源码中文说明之 prototype.js
2006/09/22 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
python查看FTP是否能连接成功的方法
2015/07/30 Python
Python数据类型详解(一)字符串
2016/05/08 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
Python爬虫实例扒取2345天气预报
2018/03/04 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
python实现对变位词的判断方法
2020/04/05 Python
python定义具名元组实例操作
2021/02/28 Python
什么是.net
2015/08/03 面试题
小学家长会邀请函
2014/01/23 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
人事专员的岗位职责
2014/03/01 职场文书
电视购物广告词
2014/03/19 职场文书
Redis如何一键部署脚本
2021/04/12 Redis
Golang之sync.Pool使用详解
2021/05/06 Golang
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
Mysql binlog日志文件过大的解决
2021/10/05 MySQL