Python 上传文件到服务器:使用 Requests 库详解316


在日常开发中,我们经常需要将文件上传到服务器。Python 的 `requests` 库提供了一种简单而高效的方式来实现这一功能。本文将详细讲解如何使用 `requests` 库上传文件,包括单文件上传、多文件上传、以及处理上传进度等高级技巧,并结合实际例子进行说明。 我们将涵盖各种场景,并讨论可能遇到的问题以及解决方法。

首先,确保你已经安装了 `requests` 库。如果没有,可以使用 pip 安装:pip install requests

单文件上传

上传单个文件是最基本的场景。使用 `()` 方法,并设置 `files` 参数即可实现。`files` 参数的值是一个字典,键值对的形式为:{'文件名': ('文件名', file, 'content-type')}。其中:
文件名: 服务器端接收文件时使用的文件名。可以和本地文件名相同,也可以不同。
file: 文件对象,可以使用open()函数打开本地文件获取。
content-type: 文件的 MIME 类型,例如 'image/jpeg', 'application/pdf' 等。如果不指定,`requests` 会尝试根据文件扩展名自动推断。

以下是一个简单的例子,上传一个名为 `` 的图片文件:```python
import requests
url = '/upload' # 替换为你的上传接口地址
files = {'image': ('', open('', 'rb'), 'image/jpeg')}
response = (url, files=files)
if response.status_code == 200:
print('文件上传成功!')
print() # 打印服务器返回的结果
else:
print(f'文件上传失败!状态码:{response.status_code}')
print() # 打印服务器返回的错误信息
```

记得将 `/upload` 替换成你的实际上传接口地址。这个例子假设服务器端能够正确处理上传的文件,并返回一个 200 OK 的状态码。 你需要根据服务器端的API文档调整代码。

多文件上传

上传多个文件只需要将 `files` 参数设置为包含多个文件对象的字典即可。 例如,上传两个文件:```python
import requests
url = '/upload'
files = {
'image1': ('', open('', 'rb'), 'image/jpeg'),
'document': ('', open('', 'rb'), 'application/pdf')
}
response = (url, files=files)
if response.status_code == 200:
print('文件上传成功!')
print()
else:
print(f'文件上传失败!状态码:{response.status_code}')
print()
```

带其他参数的上传

除了文件,你可能还需要上传其他数据,例如表单数据。可以使用 `data` 参数来传递其他参数:```python
import requests
url = '/upload'
files = {'file': ('', open('', 'rb'), 'text/plain')}
data = {'user_id': 123, 'description': 'This is my file'}
response = (url, files=files, data=data)
if response.status_code == 200:
print('文件上传成功!')
print()
else:
print(f'文件上传失败!状态码:{response.status_code}')
print()
```

处理上传进度

对于大型文件,显示上传进度对用户体验至关重要。 `requests` 本身并不提供进度条功能,需要借助第三方库,例如 `tqdm`。```python
import requests
from tqdm import tqdm
url = '/upload'
files = {'file': ('', open('', 'rb'), 'text/plain')}
with open('', 'rb') as f:
total_length = (0, 2) # 获取文件大小
(0) #重置文件指针
with tqdm(total=total_length, desc='上传进度', unit='B', unit_scale=True, unit_divisor=1024) as pbar:
response = (url, files=files, stream=True,
hooks={'response': lambda r, *args: iter_progress(r, pbar)})
if response.status_code == 200:
print('文件上传成功!')
else:
print(f'文件上传失败!状态码:{response.status_code}')
def iter_progress(r, pbar):
for chunk in r.iter_content(chunk_size=1024): #Adjust chunk size as needed
(len(chunk))
```

这段代码使用了 `tqdm` 库显示进度条, 并通过 `iter_content` 方法分块读取文件内容,更新进度条。 你需要安装 `tqdm`: `pip install tqdm`

错误处理和异常处理

在实际应用中,需要处理各种可能的错误,例如网络错误、服务器错误等。可以使用 `try...except` 块来捕获异常:```python
import requests
try:
# ... 上传文件的代码 ...
except as e:
print(f"An error occurred: {e}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
finally:
# 关闭文件句柄
if 'file' in locals() and file:
()
```

良好的错误处理能够提升程序的健壮性,确保程序在遇到错误时能够优雅地处理,避免崩溃。

本文详细介绍了使用 `requests` 库上传文件的各种方法,从单文件上传到多文件上传,以及如何处理上传进度和错误。 通过这些示例和技巧,你可以轻松地在你的 Python 程序中实现文件上传功能,并根据实际需求进行调整和扩展。

2025-06-11


上一篇:Python 字符串不可变性及其证明方法

下一篇:深入理解Python中的spec文件:构建可执行程序和软件包