使用urllib3.filepost模块的encode_multipart_formdata()方法实现POST请求中的文件上传
发布时间:2024-01-21 00:44:58
import urllib3
def file_upload(url, file_path):
http = urllib3.PoolManager()
# 创建一个MultiPartEncoder对象,用于编码multipart/form-data请求体
encoder = urllib3.filepost.encode_multipart_formdata([('file', open(file_path, 'rb'))])
# 获取编码后的请求体和请求头
fields, headers = encoder
# 发送POST请求,上传文件
response = http.request('POST', url, headers=headers, body=fields)
return response
if __name__ == '__main__':
url = 'http://example.com/upload'
file_path = 'path/to/file.jpg'
response = file_upload(url, file_path)
print(response.status)
print(response.data.decode('utf-8'))
上述代码中,我们使用urllib3.PoolManager()创建一个http对象,用于发送HTTP请求。然后,通过调用urllib3.filepost.encode_multipart_formdata()方法创建一个MultiPartEncoder对象,该对象用于编码multipart/form-data请求体。
encode_multipart_formdata()方法接受一个列表,列表中的元素为元组,每个元组中包含两个元素,第一个为字段名,第二个为文件对象。在上述例子中,我们将文件字段名设为file,并打开指定路径下的文件作为文件对象。
encode_multipart_formdata()方法返回一个元组,该元组包含了编码后的请求体和请求头。我们将请求体赋值给fields变量,请求头赋值给headers变量。
最后,我们调用http.request()方法发送POST请求,上传文件。request()方法接受四个参数:请求方法(这里为'POST'),URL,请求头,请求体。
response对象是 HTTPResponse 类型的,我们可以通过response.status获取响应状态码,通过response.data获取响应内容的字节流形式。我们可以通过response.data.decode('utf-8')将字节流解码为字符串形式,方便阅读。
请注意,上述代码仅适用于发送单个文件的请求,如果需要发送多个文件,可以在encode_multipart_formdata()方法的参数列表中依次添加多个文件元组。同时,还可以通过添加其他字段的元组,一并发送到服务器端。
另外,需要确保你已经安装了urllib3库,可以通过pip install urllib3命令进行安装。
