requests库-POST请求处理文件上传与下载

1. 文件上传

文件上传通常通过 POST 请求完成,服务端需要从请求中接收文件数据。

基本文件上传

使用 files 参数上传文件:

1
2
3
4
5
6
7
import requests

url = 'https://example.com/upload'
files = {'file': open('example.txt', 'rb')} # rb 模式读取文件
response = requests.post(url, files=files)
print(response.status_code) # 检查响应状态码
print(response.text) # 打印服务端返回的消息

上传多个文件

通过字典传递多个文件:

1
2
3
4
5
6
files = {
'file1': open('example1.txt', 'rb'),
'file2': open('example2.txt', 'rb')
}
response = requests.post('https://example.com/upload', files=files)
print(response.json()) # 假设服务端返回 JSON 格式数据

设置额外的表单字段

可以在上传文件的同时发送其他表单字段:

1
2
3
4
files = {'file': open('example.txt', 'rb')}
data = {'username': 'testuser', 'password': '123456'}
response = requests.post('https://example.com/upload', files=files, data=data)
print(response.text)

2. 文件下载

文件下载通常通过 GET 请求完成。

下载文件到内存

将文件内容读取到内存中:

1
2
3
response = requests.get('https://example.com/file.txt')
if response.status_code == 200:
print(response.content.decode('utf-8')) # 假设文件是文本格式

保存文件到本地

使用二进制模式将文件保存到本地:

1
2
3
4
5
6
url = 'https://example.com/file.txt'
response = requests.get(url)
if response.status_code == 200:
with open('downloaded_file.txt', 'wb') as f:
f.write(response.content)
print('文件已下载并保存为 downloaded_file.txt')

大文件下载(流模式)

下载大文件时,可以使用流模式以减少内存占用:

1
2
3
4
5
6
7
url = 'https://example.com/largefile.zip'
response = requests.get(url, stream=True) # 启用流模式
if response.status_code == 200:
with open('largefile.zip', 'wb') as f:
for chunk in response.iter_content(chunk_size=1024): # 分块读取
f.write(chunk)
print('大文件已下载并保存为 largefile.zip')

3. 文件上传与下载错误处理

处理上传错误

常见的错误场景包括文件未找到或服务端返回错误:

1
2
3
4
5
6
7
8
try:
files = {'file': open('non_existent_file.txt', 'rb')}
response = requests.post('https://example.com/upload', files=files)
response.raise_for_status()
except FileNotFoundError:
print('文件未找到!')
except requests.RequestException as e:
print(f'上传失败:{e}')

处理下载错误

常见的下载错误包括连接超时和文件不存在:

1
2
3
4
5
6
7
8
9
try:
response = requests.get('https://example.com/nonexistentfile.txt', timeout=10)
response.raise_for_status()
with open('file.txt', 'wb') as f:
f.write(response.content)
except requests.Timeout:
print('下载超时!')
except requests.RequestException as e:
print(f'下载失败:{e}')