Python生成multipart请求数据

本文介绍了如何在Python中使用requests库构造multipart/form-data类型的请求,以同时发送JSON数据和图片。通过设置files参数,结合元组指定数据、文件名、内容类型及自定义头部信息,实现多段数据的POST请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

最近产品中有个接口就是需要在请求中包含json和图片信息,也就是multipart/form形式的请求数据,但是在Python中如何生成这种请求数据呢?

本来构思的将不同段的数据全部取出,自己手动拼装,然后加入自定义头;可以仔细思考了一下,觉得自己造轮子肯定是重复的,Python应该有自带方法的;

结果

使用了requests库中的post方法的files参数,改参数支持元组形式,检测到改参数为元组自动将请求改为多段请求,每段请求中也支持用户自定义头部数据;
其中files参数的格式如下:

file = {'name': ('filename', data, 'content_type', headers)}

其中name、filename、content_type为String类型,data为二进制数据,heads为元组,包含你需要添加的头;

具体请求代码如下:

import requests, json, os
from requests.auth import HTTPDigestAuth

http_usr = "admin"
http_pwd = "admin"

add_face='''{
    "faceLibType": "blackFD",
	"FDID": "1",
    "FPID": "8888",
	"name": "test",
	"bornTime": "2000-01-01"
}'''
face_pic_path="./test_face.jpg"

face_mach_host = "http://192.168.8.20:80"
add_face_uri = "/FaceDataRecord"

fsize = os.path.getsize(face_pic_path)
head1={'Content-Length': len(add_face)}
head2={'Content-Length': fsize}

file = {'FaceDataRecord': (None, add_face, 'application/json', head1), 'FaceImage': (None, open('test_face.jpg', 'rb'), 'image/jpeg', head2)}
target_url = face_mach_host + add_face_uri #需要多段数据的url

r = requests.post(target_url, files=file, auth = HTTPDigestAuth(http_usr, http_pwd))
print(r.text)

参考文章:

  1. How to send a “multipart/form-data” with requests in python?
  2. POST a Multipart-Encoded File
  3. Constructing multipart MIME messages for sending emails in Python
### 使用Python生成临时文件并实现数据传输 为了满足需求,在 Python 中可以通过 `tempfile` 模块来创建临时文件,并利用标准库中的其他模块来进行数据传输。下面展示了一个简单的例子,该例子不仅展示了如何创建临时文件,还说明了怎样将这些文件的内容转移到另一个位置。 #### 创建临时文件 ```python import tempfile with tempfile.NamedTemporaryFile(mode='w+t', delete=False) as temp_file: temp_file.write('这是测试内容') temp_filename = temp_file.name print(f'已创建临时文件 {temp_filename}') ``` 这段代码使用 `NamedTemporaryFile()` 函数创建了一个带有名称的临时文件[^1]。参数 `mode='w+t'` 表明此文件既可写也可读,而 `delete=False` 则确保程序结束时不会自动删除这个文件,以便后续操作能够访问它。 #### 数据转移至目标路径 假设现在有一个目的地目录 `/path/to/destination` 需要将上述临时文件复制过去: ```python import shutil destination_path = '/path/to/destination' shutil.copy(temp_filename, destination_path) print(f'文件已经成功复制到了 {destination_path}') ``` 这里调用了 `shutil.copy()` 方法完成了从源地址到目的地址的文件拷贝工作[^2]。需要注意的是,在实际应用场景下应当考虑异常处理机制以应对可能出现的各种错误情况,比如权限不足或是磁盘空间不够等问题。 #### 发送文件前准备文件头信息 当涉及到网络环境下的文件传输时,则需按照特定协议构建相应的头部信息。对于HTTP POST请求来说,通常会采用 multipart/form-data 编码方式提交表单数据连同附件一起发送给服务器端。此时可以在客户端预先设置好必要的元数据作为文件头的一部分,例如文件名、大小等属性[^3]。 ```python from requests_toolbelt import MultipartEncoder multipart_data = MultipartEncoder( fields={ 'field0': 'value0', 'field1': ('filename.txt', open(temp_filename, 'rb'), 'text/plain'), } ) headers = {'Content-Type': multipart_data.content_type} response = requests.post(url='http://example.com/upload_endpoint', data=multipart_data, headers=headers) if response.status_code == 200: print('文件上传成功') else: print('文件上传失败:', response.text) ``` 在这个片段里,借助第三方库 `requests-toolbelt` 来简化复杂的编码过程,并且指定了 HTTP 请求头中 Content-Type 字段为由 MultipartEncoder 自动生成出来的 MIME 类型字符串。这有助于接收者解析接收到的数据流并从中提取有用的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值