You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:43:08