一、 仅上传文件
import requests url = 'http://example.com/upload_file' file_path = '/path/to/file' with open(file_path, 'rb') as f: files = {'file': f} headers = {'content-type': 'multipart/form-data'} response = requests.request('POST', url, files=files, headers=headers) print(response.text) #如果您需要上传多个文件,可以将它们保存在一个列表中,并将列表作为值传递给 files # 字典中的 'file' 键。例如: import requests url = 'http://example.com/upload_files' file_paths = ['/path/to/file1', '/path/to/file2', '/path/to/file3'] files = {} for i, file_path in enumerate(file_paths): with open(file_path, 'rb') as f: files[f'file{i}'] = f headers = {'content-type': 'multipart/form-data'} response = requests.request('POST', url, files=files, headers=headers) print(response.text)
二、 既要上传文件,又要上传参数
1) requets.request()方法中使用files参数
import requests url = 'http://example.com/upload_file' file_path = '/path/to/file' data = {'name': 'John', 'age': 30} with open(file_path, 'rb') as f: files = {'file': f} headers = {'content-type': 'multipart/form-data'} response = requests.request('POST', url, files=files, data=data, headers=headers) print(response.text) #如果您需要上传多个文件,可以将它们保存在一个列表中,并将列表作为值传递给 files 字典中的 'file' 键。例如: import requests url = 'http://example.com/upload_files' file_paths = ['/path/to/file1', '/path/to/file2', '/path/to/file3'] data = {'name': 'John', 'age': 30} files = {} for i, file_path in enumerate(file_paths): with open(file_path, 'rb') as f: files[f'file{i}'] = f headers = {'content-type': 'multipart/form-data'} response = requests.request('POST', url, files=files, data=data, headers=headers) print(response.text)
1) requets.request()方法中使用data参数, 不用files参数
"""如果您想在使用 requests 库上传文件和传递参数时,不使用 `files` 参数而是使用`data` 参数,可以使用 `MultipartEncoder` 类。`MultipartEncoder` 类可以将文件和 参数打包成 `multipart/form-data` 格式的请求体,并将其传递给 requests 库的 `data` 参数。""" import requests from requests_toolbelt.multipart.encoder import MultipartEncoder url = 'http://example.com/upload_file' file_path = '/path/to/file' data = {'name': 'John', 'age': 30} with open(file_path, 'rb') as f: encoder = MultipartEncoder(fields={'file': ('filename', f), **data}) headers = {'Content-Type': encoder.content_type} response = requests.post(url, data=encoder, headers=headers) print(response.text) """ 在上面的代码中,我们指定了要上传的文件的路径(file_path)和上传的 URL(url),并指定了要传递的参数(data)。然后,我们使用 Python 的 with
语句打开文件,将其读取为二进制数据,并将其作为值传递给名为 `fields` 的字典中的 'file' 键。我们使用 `**data` 将参数字典中的所有键值对解包到 `fields`
字典中。接着,我们使用 `MultipartEncoder` 类将 `fields` 字典打包成 `multipart/form-data` 格式的请求体,并将其传递给请求的 `data` 参数。
最后,我们指定请求头中的 `Content-Type` 为 `encoder.content_type`,以确保请求体以 `multipart/form-data` 格式上传。我们使用 `requests.post`
方法将请求发送到指定的 URL。请注意,这种方法需要使用 `requests_toolbelt` 库中的 `MultipartEncoder` 类。如果您没有安装这个库,
可以通过 `pip install requests-toolbelt` 命令进行安装。另外,这种方法不支持上传多个文件,如果您需要上传多个文件,建议使用前面示例中的方法。"""
3) 两者的区别
使用 `files` 参数的方法:
优点:
- 简单易用,可以方便地上传单个或多个文件。
- `requests` 库会自动将文件打包成 `multipart/form-data` 格式的请求体,无需手动设置请求头。
缺点:
- 由于 `requests` 库会自动将文件打包成 `multipart/form-data` 格式的请求体,因此可能会占用更多的内存。
- 对于大文件或多个文件的上传,可能会导致上传速度变慢或内存不足的情况。
不使用 `files` 参数的方法:
优点:
- 可以使用 `MultipartEncoder` 类将文件和参数打包成 `multipart/form-data` 格式的请求体,更加灵活。
- 可以手动设置请求头,更加精细地控制请求。
缺点:
- 相对来说比较复杂,需要使用 `MultipartEncoder` 类进行打包。
- 需要手动设置请求头,容易出错。
综上所述,使用 `files` 参数的方法相对来说更加简单易用,适用于上传单个或少量文件的情况;而不使用 `files` 参数的方法相对来说更加灵活,适用于上传大文件或多个文件的情况。具体使用哪种方法,可以根据实际情况进行选择。
标签:files,文件,data,headers,file,path,requests,上传 From: https://www.cnblogs.com/lintest/p/17282908.html