如何使用Python的requests库向REST API上传文件及相关原理咨询
如何使用Python的requests库向REST API上传文件及相关原理咨询
嘿,很高兴帮你解答这个问题,我分两部分给你讲清楚:怎么用requests传文件,以及两种请求方式背后的区别~
一、用requests上传文件的具体实现
你之前用curl的-F参数实现的是multipart/form-data类型的请求,在requests里对应的是files参数,直接用它就能完成文件上传,代码示例如下:
基础版:只上传文件
import requests url = 'https://abc.example.com/v1/....' # 这里的键名(比如"image")要和API要求的字段名完全匹配,和curl里的-F "image=@..."对应 files = {'image': open('/path/to/your/image', 'rb')} response = requests.post(url, files=files) print(response.text)
进阶版:同时上传文件+文本参数
如果API还要求你传额外的文本字段(比如文件描述、用户ID),可以把data参数和files一起使用:
import requests url = 'https://abc.example.com/v1/....' files = {'image': open('/path/to/your/image', 'rb')} # 这里的data就是普通的表单文本字段 data = {'description': '这是一张测试用的图片', 'user_id': '12345'} response = requests.post(url, files=files, data=data) print(response.text)
⚠️ 注意:打开文件一定要用rb模式(二进制只读),因为文件是二进制数据,用文本模式打开会损坏内容。
二、两种请求方式的背后原理对比
你之前常用的json=data和现在要用到的files参数,本质是两种不同的HTTP请求格式,适用场景完全不同:
1. 用json参数发送JSON文本数据
- 这种方式会自动把你的Python字典序列化成JSON字符串,同时设置请求头
Content-Type: application/json - 它专门用来传递纯文本结构化数据,比如用户信息、配置参数这类键值对/数组数据,数据格式清晰,传输效率高
- 但它没法直接处理二进制数据(比如图片),如果硬要传,只能把二进制转成base64编码的字符串,这样会增加数据体积,效率很低
2. 用files参数发送multipart/form-data请求
- 这是HTTP协议专门为**传输二进制数据(文件)和混合数据(文件+文本)**设计的格式
- 请求体会被拆分成多个独立的“部分”(part),每个部分可以是一个文件或者一个文本字段,每个部分都有自己的头信息(比如文件名、内容类型)
- requests会自动帮你设置请求头
Content-Type: multipart/form-data,并把文件和文本参数打包成符合格式的请求体,和你用curl的-F效果完全一致 - 这种方式是上传文件的标准做法,能高效处理各种二进制内容,比如图片、视频、压缩包等
简单总结:纯文本数据用json参数最方便,传文件或混合数据就用files参数(对应curl的-F)。
备注:内容来源于stack exchange,提问作者no_reservations
相关产品推荐
相关产品推荐

