欢迎访问宙启技术站
智能推送

使用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命令进行安装。