本文档描述了Data Pipeline文件上传功能的详细设计,包括API接口设计、文件管理机制、安全控制和使用示例。
.ddl
- DDL文件.md
- Markdown文档.txt
- 文本文件.json
- JSON文件.sql
- SQL文件.csv
- CSV文件原文件名_bak1
, 原文件名_bak2
等上传文件到指定任务目录。
路径参数:
task_id
(string, required): 任务ID表单参数(multipart/form-data):
file
(file, required): 要上传的文件overwrite_mode
(string, optional): 重名处理模式,可选值:backup
(默认)、replace
、skip
成功响应(200):
{
"success": true,
"code": 200,
"message": "文件上传成功",
"data": {
"task_id": "task_20250701_123456",
"uploaded_file": {
"filename": "test.ddl",
"size": 1024,
"size_formatted": "1.0 KB",
"uploaded_at": "2025-07-01T12:34:56",
"overwrite_mode": "backup"
},
"backup_info": { // 仅当overwrite_mode为backup且文件已存在时返回
"had_existing_file": true,
"backup_filename": "test.ddl_bak1",
"backup_version": 1,
"backup_created_at": "2025-07-01T12:34:56"
}
}
}
跳过上传响应(200):
{
"success": true,
"code": 200,
"message": "文件已存在,跳过上传",
"data": {
"task_id": "task_20250701_123456",
"skipped": true,
"uploaded_file": {
"filename": "test.ddl",
"existed": true,
"action": "skipped"
}
}
}
错误响应:
400 Bad Request
: 参数错误、文件验证失败404 Not Found
: 任务不存在500 Internal Server Error
: 服务器内部错误文件类型不支持(400):
{
"success": false,
"code": 400,
"message": "不支持的文件类型: .exe,允许的类型: .ddl, .md, .txt, .json, .sql, .csv"
}
文件大小超限(400):
{
"success": false,
"code": 400,
"message": "文件大小超出限制: 11.0 MB,最大允许: 10.0 MB"
}
任务不存在(404):
{
"success": false,
"code": 404,
"message": "任务不存在: task_invalid_id"
}
class SimpleFileManager:
# 支持的文件类型
ALLOWED_EXTENSIONS = {'.ddl', '.md', '.txt', '.json', '.sql', '.csv'}
MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB
def upload_file_to_task(self, task_id, file_stream, filename, overwrite_mode="backup"):
"""上传文件到任务目录"""
def validate_file_upload(self, filename, file_stream):
"""验证文件合法性"""
def create_backup_file(self, original_path):
"""创建备份文件"""
def find_next_backup_version(self, file_path):
"""查找下一个可用的备份版本号"""
当选择backup模式且目标文件已存在时,系统会自动创建备份文件:
test.ddl
test.ddl_bak1
test.ddl_bak2
..
<>:"|?*
\x00-\x1f
CON
, PRN
, AUX
, NUL
, COM1-9
, LPT1-9
data_pipeline/
└── training_data/
└── {task_id}/
├── test.ddl
├── test.ddl_bak1
├── test.md
├── config.json
└── ...
curl -X POST \
http://localhost:8084/api/v0/data_pipeline/tasks/task_20250701_123456/files \
-F "file=@test.ddl" \
-F "overwrite_mode=backup"
import requests
def upload_file(task_id, file_path, overwrite_mode="backup"):
url = f"http://localhost:8084/api/v0/data_pipeline/tasks/{task_id}/files"
with open(file_path, 'rb') as f:
files = {'file': (file_path.name, f)}
data = {'overwrite_mode': overwrite_mode}
response = requests.post(url, files=files, data=data)
return response.json()
# 使用示例
result = upload_file("task_20250701_123456", "test.ddl", "backup")
print(result)
async function uploadFile(taskId, file, overwriteMode = 'backup') {
const formData = new FormData();
formData.append('file', file);
formData.append('overwrite_mode', overwriteMode);
const response = await fetch(
`/api/v0/data_pipeline/tasks/${taskId}/files`,
{
method: 'POST',
body: formData
}
);
return await response.json();
}
// 使用示例
const fileInput = document.getElementById('fileInput');
const file = fileInput.files[0];
const result = await uploadFile('task_20250701_123456', file, 'backup');
console.log(result);
可以通过修改 SimpleFileManager.ALLOWED_EXTENSIONS
来调整支持的文件类型:
ALLOWED_EXTENSIONS = {'.ddl', '.md', '.txt', '.json', '.sql', '.csv', '.py'}
可以通过修改 SimpleFileManager.MAX_FILE_SIZE
来调整文件大小限制:
MAX_FILE_SIZE = 20 * 1024 * 1024 # 20MB
错误类型 | HTTP状态码 | 说明 |
---|---|---|
参数缺失 | 400 | 缺少必需的file参数 |
文件类型不支持 | 400 | 文件扩展名不在允许列表中 |
文件大小超限 | 400 | 文件大小超过10MB限制 |
文件为空 | 400 | 上传的文件内容为空 |
文件名不安全 | 400 | 文件名包含危险字符 |
任务不存在 | 404 | 指定的task_id不存在 |
服务器错误 | 500 | 文件保存失败等内部错误 |
Data Pipeline文件上传API提供了一个安全、可靠的文件管理解决方案,支持多种文件类型和灵活的重名处理策略。通过严格的安全控制和完善的错误处理,确保了系统的稳定性和安全性。
该API设计遵循RESTful原则,提供了清晰的接口定义和详细的文档说明,便于开发者集成和使用。