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

Python中的encode_multipart_formdata()函数和多个文件上传的示例

发布时间:2023-12-28 22:45:52

在Python中,可以使用encode_multipart_formdata()函数来编码多部分表单数据,并构建用于文件上传的请求体。该函数的定义如下:

def encode_multipart_formdata(fields, files):
    """
    Encode a list of fields and files as multipart form data.
    
    Arguments:
    fields -- a sequence of (name, value) tuples for the fields to encode
    files -- a sequence of (name, filename, value) tuples for the files to encode
    
    Returns:
    A tuple containing the encoded form data and the content type
    """
    boundary = "--------------------Boundary" + str(time.time())
    body = BytesIO()
    
    # Add fields to the body
    for name, value in fields:
        body.write(b'--%s\r
' % boundary.encode('ascii'))
        body.write(b'Content-Disposition: form-data; name="%s"\r
\r
' % name.encode('ascii'))
        body.write(value.encode('utf-8'))
        body.write(b'\r
')
    
    # Add files to the body
    for name, filename, value in files:
        body.write(b'--%s\r
' % boundary.encode('ascii'))
        body.write(b'Content-Disposition: form-data; name="%s"; filename="%s"\r
' % (name.encode('ascii'), filename.encode('utf-8')))
        body.write(b'Content-Type: application/octet-stream\r
\r
')
        body.write(value)
        body.write(b'\r
')
    
    body.write(b'--%s--\r
' % boundary.encode('ascii'))
    content_type = 'multipart/form-data; boundary=%s' % boundary
    
    body = body.getvalue()
    return body, content_type

下面是一个示例,演示如何使用encode_multipart_formdata()函数来上传多个文件:

import requests

def upload_files(url, files):
    fields = []
    for i, file in enumerate(files, start=1):
        fields.append(('file%d' % i, file[2]))
    
    body, content_type = encode_multipart_formdata(fields, files)
    headers = {'Content-Type': content_type}
    
    response = requests.post(url, headers=headers, data=body)
    return response.text

# 上传的文件列表
files = [
    ('alice.txt', 'text/plain', open('alice.txt', 'rb').read()),
    ('bob.txt', 'text/plain', open('bob.txt', 'rb').read())
]

# 上传文件的URL
url = 'https://example.com/upload'

# 调用上传函数
response = upload_files(url, files)
print(response)

在上面的示例中,首先定义了一个upload_files()函数,该函数接受一个URL和文件列表作为参数。在函数内部,通过encode_multipart_formdata()函数将文件列表编码成多部分表单数据。然后,根据编码后的表单数据构建请求头,发送POST请求上传文件。最后,打印服务器的响应。

需要注意的是,示例中的files列表中的每个文件都是一个元组,包含文件名、文件类型和文件内容。在实际使用中,可以根据需要设置文件名和文件类型。在示例中,假设上传的文件是文本文件,因此文件类型设置为text/plain

总结起来,encode_multipart_formdata()函数和多文件上传示例可以帮助你在Python中使用多部分表单数据来上传多个文件。这在需要向服务器端上传文件的情况下非常有用。