Python高效发送文件:requests库与多部分表单详解295


在日常开发中,经常需要使用Python向服务器发送文件,例如上传图片、视频或其他类型的文件。Python的`requests`库提供了一种简单而高效的方式来实现这一功能,本文将深入探讨使用`requests`库发送文件,并涵盖一些高级技巧,例如处理大文件、设置超时以及处理错误响应。

最常用的方法是使用`()`方法结合`multipart/form-data`编码。`multipart/form-data`编码允许在同一个请求中发送多种数据类型,包括文本数据和文件。 `requests`库巧妙地处理了这种编码,使我们无需手动构建复杂的HTTP请求。

基础用法:发送单个文件

发送单个文件到服务器的基本流程如下:```python
import requests
url = '/upload' # 替换为你的上传地址
files = {'file': open('path/to/your/', 'rb')} # 'rb' 以二进制模式读取文件,至关重要
response = (url, files=files)
if response.status_code == 200:
print('文件上传成功:', )
else:
print('文件上传失败:', response.status_code, )
```

这段代码首先导入`requests`库,然后定义上传地址`url`和文件路径。`files`参数是一个字典,键是服务器端接收文件字段的名称(通常由服务器API文档指定),值是打开的文件对象。关键在于使用`'rb'`模式打开文件,以确保文件内容以二进制格式发送。最后,代码检查HTTP响应状态码,以判断上传是否成功。记得在使用完毕后关闭文件,避免资源泄漏:```python
files = {'file': open('path/to/your/', 'rb')}
try:
response = (url, files=files)
# ... 处理响应 ...
finally:
files['file'].close()
```

或者使用上下文管理器,更优雅地处理文件关闭:```python
import requests
url = '/upload'
with open('path/to/your/', 'rb') as f:
files = {'file': f}
response = (url, files=files)
if response.status_code == 200:
print('文件上传成功:', )
else:
print('文件上传失败:', response.status_code, )
```

发送多个文件

发送多个文件只需将`files`字典扩展即可,每个键值对代表一个文件:```python
import requests
url = '/upload'
files = {
'file1': open('path/to/', 'rb'),
'file2': open('path/to/', 'rb')
}
with (url, files=files) as response:
if response.status_code == 200:
print('文件上传成功:', )
else:
print('文件上传失败:', response.status_code, )
```

处理大文件

对于大文件,直接读取到内存可能会导致内存溢出。这时,我们可以使用分块上传,即每次只上传一部分文件内容:```python
import requests
url = '/upload'
chunk_size = 1024 * 1024 # 1MB
with open('path/to/', 'rb') as f:
files = {'file': f}
response = (url, files=files, stream=True)
if response.status_code == 200:
print('文件上传成功:', )
else:
print('文件上传失败:', response.status_code, )
```

这里我们使用了`stream=True`参数,告诉`requests`库以流的方式上传文件,避免将整个文件加载到内存中。 然而,需要注意的是,服务器端也需要支持分块上传。

设置超时

为了避免请求长时间阻塞,可以设置超时时间:```python
import requests
url = '/upload'
timeout = 10 # 设置超时时间为10秒
with open('path/to/your/', 'rb') as f:
files = {'file': f}
try:
response = (url, files=files, timeout=timeout)
if response.status_code == 200:
print('文件上传成功:', )
else:
print('文件上传失败:', response.status_code, )
except :
print('请求超时')
except as e:
print(f"请求出错: {e}")
```

添加其他数据

除了文件,还可以同时发送其他数据,例如表单数据:```python
import requests
url = '/upload'
files = {'file': open('path/to/your/', 'rb')}
data = {'name': 'myfile', 'description': 'This is my file'}
response = (url, files=files, data=data)
if response.status_code == 200:
print('文件上传成功:', )
else:
print('文件上传失败:', response.status_code, )
```

本文详细介绍了使用Python `requests`库发送文件的各种方法,并涵盖了处理大文件、设置超时以及添加其他数据的技巧。 记住根据服务器API文档调整代码中的参数,确保文件上传成功。

2025-04-18


上一篇:Python 中的 Uniform 函数:深入理解和应用

下一篇:Python高效处理GBK编码文件:写入、读取及常见问题解决