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中使用 Selenium 实现网页截图实例
Jul 18 Python
python UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
python文件名和文件路径操作实例
Sep 29 Python
Python+树莓派+YOLO打造一款人工智能照相机
Jan 02 Python
Python3处理HTTP请求的实例
May 10 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
Dec 28 Python
python实现二级登陆菜单及安装过程
Jun 21 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
python SVD压缩图像的实现代码
Nov 05 Python
Python numpy线性代数用法实例解析
Nov 15 Python
详解查看Python解释器路径的两种方式
Oct 15 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 采集获取指定网址的内容
2010/01/05 PHP
php分页思路以及在ZF中的使用
2012/05/30 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
用循环或if语句从json中取数据示例
2014/08/18 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
详解Python 中的容器 collections
2020/08/17 Python
基于Python正确读取资源文件
2020/09/14 Python
selenium自动化测试入门实战
2020/12/21 Python
python爬取youtube视频的示例代码
2021/03/03 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
简历中自我评价范文3则
2013/12/14 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
一份创业计划书范文
2014/02/08 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
场地使用证明模板
2014/10/25 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang