文件上传下载接口
URL 中的 $view 为路由前缀(如 /pipeline_modelview/api),见 01-通用约定与路径对照.md。
11. 下载模板 download_template
导入数据前先下载 CSV 模板,获取字段名和示例值。
GET http://x.x.x.x/$view/api/download_template/
请求参数: 无。
响应: CSV 文件流。
- 首行为
add_columns字段名 - 第二行为示例值
路由定义见
myapp/views/baseApi.py:1640(/download_template/)。
12. 批量上传 / 导入 upload
通过 CSV 或 JSON 文件批量导入数据到对应表。
POST http://x.x.x.x/$view/api/upload/
Content-Type: multipart/form-data
请求参数(Form Data):
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| csv_file | file | 是 | 上传文件,支持 .csv 和 .json 格式 |
CSV 文件要求: 首行 header 必须与数据库字段名一一对应。
响应示例:
{
"status": 0,
"message": "success 3 rows",
"result": ["success", "success", "字段xxx不能为空"]
}
说明:
- result 数组中每个元素对应上传文件中的一行处理结果,成功为
"success",失败为具体错误信息 - 路由定义见
myapp/views/baseApi.py:1684(/upload/)
13. 批量下载 / 导出 download
将表数据导出为 CSV 文件。
GET http://x.x.x.x/$view/api/download/
请求参数(通过 form_data query 传递):
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 否 | 指定导出的记录 id,逗号分隔,如 id=1,2,3 |
| filters | array | 否 | 同 list 接口的 filter 格式,导出筛选后的数据 |
说明:
- 不传参数则导出全表数据(上限 20000 条,
myapp/views/baseApi.py:1864中page_size='20000') - 返回 CSV 文件流
- 路由定义见
myapp/views/baseApi.py:1827(/download/)
14. 通用分块文件上传 upload_files
分块上传文件到服务器,支持大文件。
POST http://x.x.x.x/$view/api/upload_files/
Content-Type: multipart/form-data
请求参数(Form Data):
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| file | file | 是 | 文件分块内容 |
| filename | string | 是 | 完整文件名 |
| upload_id | string | 否 | 前端生成的上传会话 ID(不传则回退使用 filename) |
| current_chunk | int | 否 | 当前分块序号(从 0 开始,默认 0) |
| current_offset | int | 否 | 当前分块在文件中的字节偏移量(默认 0) |
| total_chunk | int | 否 | 总分块数(默认 1) |
| total_size | int | 否 | 文件总大小(字节),最后一块上传完成后用于校验 |
中间分块响应:
{"status": 0, "message": "chunk received"}
最后一块响应:
{"status": 0, "path": "文件存储路径"}
说明:
- 文件名通过
secure_filename做安全化处理;缺少filename返回 HTTP 400 - 后缀黑名单
BLOCKED_EXTENSIONS(myapp/views/baseApi.py:1760):.exe.bin.so.dll.dylib.sh.bat.cmd.com.elf.msi.app.deb.rpm.dmg.iso.o.a.lib.class.pyc.pyo;命中返回 HTTP 400 - 最后一块若
total_size与实际文件大小不一致,返回 HTTP 500file size mismatch - 存储目录与返回路径由
get_upload_base_path(filename, upload_id)决定,子类可覆盖。基类默认(myapp/views/baseApi.py:1769):- 物理存储目录:
/data/k8s/kubeflow/pipeline/workspace/{username}/upload/{表名}/{YYYYMMDD}/{HH}/{MM}/ - 返回给前端的路径:
/mnt/{username}/upload/{表名}/{YYYYMMDD}/{HH}/{MM}/{filename}
- 物理存储目录:
⚠️ 已按代码改正:原 API 文档中的「Pipeline 工作空间文件上传
upload_to_workspace」(/ai_pipeline/upload_to_workspace/、/data_pipeline/upload_to_workspace/)在当前代码中已不存在(grep -rn "upload_to_workspace" myapp无命中)。工作空间上传现已统一为上面的upload_files/,由各视图覆写get_upload_base_path定制目录。