一、单字段发送单个文件

url = "http://httpbin.org/post"
data = None
files = { ... }
r = requests.post(url, data, files=files)

而这个files参数是可以接受很多种形式的数据,最基本的2种形式为字典类型和元祖列表类型

1、字典类型的files参数

{
  "field1" : ("filename1", open("filePath1", "rb")),
  "field2" : ("filename2", open("filePath2", "rb"), "image/jpeg"),
  "field3" : ("filename3", open("filePath3", "rb"), "image/jpeg", {"refer" : "localhost"})
}

这个字典的key就是发送post请求时的字段名, 而字典的value则描述了准备发送的文件的信息;从上面可以看出value可以是2元组,3元组或4元组

缺省的话则会使用默认值。除了上面的使用形式,其实requests还是支持一个更简洁的参数形式,如下

{

"field1" : open("filePath1", "rb"),

"field2" : open("filePath2", "rb"),

"field3" : open("filePath3", "rb")

}

{
  "field1" : ("filename1", open("filePath1", "rb")),
  "field2" : ("filename2", open("filePath2", "rb")),
  "field3" : ("filename3", open("filePath3", "rb"))

}

2、元祖列表类型的files参数

其实元组列表的形式与字典的形式基本一样,除了最外层的包装不一样;而在requests内部最终会把字典参数形式 转换 为 元组列的形式。官网推荐的用法如下:

[
  ("field1" : ("filename1", open("filePath1", "rb"))),
  ["field2" : ("filename2", open("filePath2", "rb"), "image/jpeg")],
  ("field3" : ("filename3", open("filePath3", "rb"), "image/jpeg", {"refer" : "localhost"}))
]
列表里面的子项可以是元组,也可以是列表;同样这里也支持简介的形式,如下:

[
  ("field1" : open("filePath1", "rb"))),  ##filename 使用的是filepath的文件名
  ("field2" : open("filePath2", "rb").read())) ##filename 使用的是键值,即 field2
]

二、单字段发送多个文件,即上传文件时,设置为多选了

2.1、字典参数形式

{
  "field1" : [
                 ("filename1", open("filePath1", "rb")), 
                 ("filename2", open("filePath2", "rb"), "image/png"), 
                 open("filePath3", "rb"),
                 open("filePath4", "rb").read()
               ]
}

2.2、元组列表形式

[
  ("field1" , ("filename1", open("filePath1", "rb"))),
  ("field1" , ("filename2", open("filePath2", "rb"), "image/png")), 
  ("field1" , open("filePath3", "rb")),
  ("field1" , open("filePath4", "rb").read())
]

三、上传单张图片实例:

3.1、用fiddler抓包,查看接口请求格式和图片传参格式:

Content-Type:multipart/form-data

Content-Type: image/png
Content-Disposition: form-data; name="file"; filename="file.png"

3.2、上传图片

url='XXXXXXXXXXXXXX/1.0/bd/user/punch_clock'
files={"file": ("1.png", open(r"C:\Users\wangli\PycharmProjects\InterfaceAutomationTesting\case\1.png", "rb"), "image/png")}
headers={"Authorization":"bearereyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9vbnNpdGUtYXBpLnN0MS50ZXN0LmxhbnhpbmthLmNvbVwvMS4wXC9hZG1pblwvbWFuYWdlclwvbG9naW4iLCJpYXQiOjE1NTkxMjkzNjIsImV4cCI6MTU2MTgwNzc2MiwibmJmIjoxNTU5MTI5MzYyLCJqdGkiOiI4Y0VweGdnVDc3NjFwRkxnIiwic3ViIjoyMzUsInBydiI6IjA1NzdiNDFmNTRlMDk1YTNkOGNhMjM3NDM2NTAxYjhiN2IxZmU0YTQifQ.RUeRExypNq2sWY7CCOwH60xBEDgvRMytYKxEE2Ze35k"}
r=requests.post(url=url,headers=headers,files=files)
print(r.json())

四、上传图片实例:

4.1.上传图片以下这种格式:
-----------------------------22165374713946
Content-Disposition: form-data; name="localUrl"

yoyoketang.png
-----------------------------22165374713946
Content-Disposition: form-data; name="imgFile"; filename="yoyoketang.png"
Content-Type: image/png

2.写成字典格式,key对应name="imgFile"这里name对应的值

3.value里面是一个元组()

  • 第一个参数是filename=后面对应的值,没有就写None
  • 第二个是上面的这个值“”yoyoketang.png“”,或者是文件open打开的二进制流
  • 第三个是Content-Type对应的类型,如:"image/png"

f ={
"localUrl": (None,"1.png"),
"imgFile": ("1.png", open("d:\1.png", "rb"), "image/png")
}

# 上传图片

url1 = "http://127.0.0.1:81/zentao/file-ajaxUpload-5a26aca290b59.html?dir=image"

f ={ "localUrl": (None,"1.png"), "imgFile": ("1.png", open("d:\\1.png", "rb"), "image/png") }

r = s.post(url1, files=f)

五、上传图片实例:

url='http://ta.2boss.cn/rabbit/v1/user/addAdvise'
data={"advise":"测试上传图片","customerId":"47066750",
"images":["http:\/\/2boss.oss-cn-hangzhou.aliyuncs.com\/54a0e078e4f4588d4a6efdfafa8cc621.jpg",
          "http:\/\/2boss.oss-cn-hangzhou.aliyuncs.com\/82f7ad533662ca918f75035b8bc063f6.jpg"]}
headers={"TBSAccessToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6ImY3NDA4MWUzLTVhYzgtNDRkNS05NWFlLWM1OGM0ZmRhOWEyNCIsInNjb3BlIjoiQ09OU1VNRVIiLCJpc3MiOiJodHRwOi8vbGl5b3UuY28iLCJleHAiOjE1NjE3Nzg0MjcsInVzZXJJZCI6OTUxNTMsImV4cGlyZXNBdCI6MTU2MTc3ODQyNzcyNX0.4ZKIhwgQTTqxabsLs9_wX5r-dkaULgqfA2ENhkSnZPo"}

r=requests.post(url=url,headers=headers,json=data)
print(r.json())

六、传多个附件

1.传多个文件的时候如下,这两个参数的name都是一样的,如果用字典去传key值,很显然python的key值是不能重复的

Content-Disposition: form-data; name="files[]"; filename="1.png"

Content-Type: image/png

Content-Disposition: form-data; name="files[]"; filename="2.png"

Content-Type: image/png

2.这时候需要换个格式,传list数据

# file = {

# "files[]": ("1.png", open("d:\\1.png", "rb"), "image/png"),

# "labels[]": "tu1",

# }

#-------------多个文件用list类型------------

file = [

("files[]", ("2.png", open("d:\\1.png", "rb"), "image/png")),

("labels[]", "tu1"),

("files[]", ("2.png", open("d:\\2.png", "rb"), "image/png")),

("labels[]", "tu2"),

]

Python模拟实现multipart/form-data格式上传图片文件相关推荐

  1. Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件

    Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...

  2. 利用Python模拟鼠标操作,一键将GIF文件载入CSDN的Markdown编辑器

    简 介: 讨论了在csdn的Markdown编译器中自动载入GIF文件的方法.使用了Python中的pyautogui软件包,可以通过Python的小程序实现一键将GIF文件载入CSDN的Markdo ...

  3. 1. 恼人的Multipart form data

    文章目录 1. 概述 2. 问题 3. 解决方案 3.1 解决方案一 3.2 解决方案二 3.3 解决方案三 4. 总结 1. 概述 我目前在公司负责开放平台项目,使用spring-cloud-gat ...

  4. flux读取不到数据_WebFlux 中form data获取不到参数问题

    Spring WebFlux 中, request.queryParams 只能获取到 查询参数, 对于 form 提交的参数无法进行参数自动装载 处理方式有两种: 一. 自定义 ArgumentRe ...

  5. python打开word格式的文件。查找中文错别字

    你可以使用 python 的库来打开 word 格式的文件,然后查找中文错别字. 一种方法是使用 python-docx 库. 你可以在命令行中使用 pip 安装这个库: pipinstall pyt ...

  6. python模拟浏览器上传文件_Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)...

    http协议本身的原始方法不支持multipart/form-data请求,这个请求由原始方法演变而来的. multipart/form-data的基础方法是post,也就是说是由post方法来组合实 ...

  7. python post请求 上传图片_利用python模拟实现POST请求提交图片的方法

    本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...

  8. python模拟上传图片_用python创建自己的等离子图片模拟

    python模拟上传图片 For today's recreational coding exercise, we will investigate plasma physics with parti ...

  9. 前端form表单上传图片等信息,python后端接收

    前端form表单上传图片等信息,python后端接收. 最近总需要做关于图片上传的东西.一直百度,这次想自己记录一下. HTML代码: <form class="box" a ...

最新文章

  1. python怎么用matplotlib生成图表_Python让图表奔跑起来,Matplotlib的神奇用处
  2. java 9宫格抽奖_前端js实现九宫格模式抽奖(多宫格抽奖)
  3. 为何多线程就能提高Java程序的执行效率
  4. 关于 spring-aop理解
  5. python自学步骤-零基础学Python应该学习哪些入门知识及学习步骤安排
  6. iOS 使用UI控件的外观协议UIAppearance进行设置默认UI控件样式
  7. Atom编写Markdown
  8. (转)Java中的private、protected、public和default的区别
  9. 核心概念——节点/边/Combo——内置节点——Triangle
  10. SetRegistryKey的作用
  11. 争做RTC领域标杆——与华为云副总裁薛浩聊聊我们的视频时代
  12. Pandas 文本数据方法 split()rsplit()
  13. netstat -an|awk '/^tcp/ {++s[$NF]} END {for( a in s) {print a,s[a]}}'
  14. VC2013配置OpenCV开发环境
  15. JavaWeb01-HTML篇笔记(一)
  16. python程序文件扩展名主要是什么_python程序文件扩展名知识点详解
  17. 解决精灵标注助手暂不支持导入pascal文件
  18. 计算机打字键盘怎么控制,键盘不受控制怎么办?
  19. 灵魂书籍 | 《记忆力心理学 | 赫尔曼·艾宾浩斯》
  20. OpenCV2.4.13 文本分割(水平垂直,直方图投影)

热门文章

  1. 关联规则算法c语言样例及分析_推荐系统总结系列-关联规则算法(四)
  2. vue图片点击超链接_10秒钟,告别ppt中难看的超链接
  3. matlab多元函数_函数的计算机处理8(1)_1MATLAB
  4. MySQL建立多选一列表_如何实现自定义列表的多个item,的单选或多选
  5. pythonmulti函数_python – 用于使用MultiIndex创建pandas系列的语法糖
  6. dijkstra算法代码_深度好文:改变了我们生活方式最有影响力的5种图算法
  7. websocket 获取连接id_websocket建立连接时能传递参数吗
  8. Spring —— 容器内部逻辑
  9. mysql 数据记录导出_mysql如何导出600万条记录的数据表?
  10. git配置用户信息_git系列教程(4)-单用户配置