Python REST API 文件上传:完整指南及最佳实践267


在现代 Web 应用中,文件上传是一个常见的功能需求。 Python 提供了强大的工具和库,可以轻松构建 RESTful API 来处理文件上传。本文将详细介绍如何使用 Python 创建一个 REST API,支持文件上传,并涵盖最佳实践,例如处理大文件、错误处理和安全性。

我们将使用 Flask 框架来构建我们的 API,因为它简单易用且适合小型到中型项目。 当然,其他框架如 Django REST framework 也能胜任,但 Flask 提供了更精简的入门体验。 我们还需要 `requests` 库来测试我们的 API。

首先,安装必要的库:```bash
pip install Flask requests
```

接下来,让我们创建一个简单的 Flask 应用来处理文件上传:```python
from flask import Flask, request, jsonify
app = Flask(__name__)
@('/upload', methods=['POST'])
def upload_file():
if 'file' not in :
return jsonify({'error': 'No file part'}), 400
file = ['file']
if == '':
return jsonify({'error': 'No selected file'}), 400
if file:
filename =
(f'./uploads/{filename}') # 保存文件到 uploads 目录
return jsonify({'message': 'File uploaded successfully'}), 200
return jsonify({'error': 'File upload failed'}), 500
if __name__ == '__main__':
import os
if not ('uploads'):
('uploads') # 创建 uploads 目录
(debug=True)
```

这段代码定义了一个 `/upload` 路由,只接受 POST 请求。 它检查请求中是否存在名为 `file` 的文件部分,并验证文件名是否为空。 如果文件存在且有效,则将其保存到 `uploads` 目录。 如果任何步骤失败,则返回相应的错误代码和 JSON 响应。 请确保在运行代码之前创建一个名为 `uploads` 的目录。

使用 `requests` 库测试 API:```python
import requests
files = {'file': open('', 'rb')} # 替换 为你的文件
response = ('127.0.0.1:5000/upload', files=files)
print(())
```

记住替换 `` 为你的实际文件名。

处理大文件:

对于大文件,直接将整个文件加载到内存中是不明智的。 我们可以使用流式上传的方式,逐块读取文件并将其写入磁盘,从而减少内存消耗。 Flask 提供了 `stream` 属性来实现这一点:```python
@('/upload', methods=['POST'])
def upload_file():
# ... (previous code) ...
if file:
filename =
with open(f'./uploads/{filename}', 'wb') as f:
while True:
chunk = (1024) # 读取 1KB 的块
if not chunk:
break
(chunk)
return jsonify({'message': 'File uploaded successfully'}), 200
# ... (rest of the code) ...
```

这段代码以 1KB 的块大小读取文件,并将每个块写入磁盘。 你可以根据需要调整块大小。

错误处理和安全性:

完善的错误处理对于一个健壮的 API 至关重要。 我们已经添加了一些基本的错误处理,但可以进一步改进,例如处理文件类型限制、文件大小限制以及更详细的错误消息。 安全性也是关键,应该对上传的文件进行严格的验证和消毒,以防止恶意代码的执行。

文件类型验证:```python
allowed_extensions = {'txt', 'pdf', 'png', 'jpg', 'jpeg'}
def allowed_file(filename):
return '.' in filename and \
('.', 1)[1].lower() in allowed_extensions
# 在upload_file函数中添加验证:
if file and allowed_file():
# ... (文件保存代码) ...
else:
return jsonify({'error': 'Invalid file type'}), 400
```

文件大小限制:```python
from import secure_filename
# ... (其他代码) ...
@('/upload', methods=['POST'])
def upload_file():
if 'file' not in :
return jsonify({'error': 'No file part'}), 400
file = ['file']
if == '':
return jsonify({'error': 'No selected file'}), 400
if file and allowed_file() and file.content_length < 1024 * 1024 * 10: # 限制文件大小为 10MB
filename = secure_filename() # 使用secure_filename防止文件名注入
# ... (文件保存代码) ...
else:
return jsonify({'error': 'Invalid file or file size too large'}), 400
```

这段代码添加了文件大小限制 (10MB) 和使用 `secure_filename` 来防止文件名注入攻击。

总结:本文提供了一个使用 Flask 构建 Python REST API 进行文件上传的完整指南,并涵盖了处理大文件、错误处理和安全性的最佳实践。 记住根据你的具体需求调整代码和配置,并始终优先考虑安全性。

2025-06-03


上一篇:Python字典键值对:字符串键的深入探讨及最佳实践

下一篇:Python高效替换特殊字符串:方法、技巧及性能优化