pipeline-sdlc/wwwroot/api/workspace_upload.dspy
ymq 0c66bdee81 fix(workspace): 工作控件产线隔离——弹窗与9个子端点全部按产线过滤
- workspace_popup 把 pipeline_id 透传给树/文件/查看/编辑/删除子端点
- 9个子端点 get_project_dir→get_project_dir_pl(跨产线项目视为无项目)
- 开发驾驶舱工作空间按钮补传 pipeline_id=sdlc_general
- 修复:会话绑投标项目时开发驾驶舱工作空间直接打开投标项目目录(已实测复现)
2026-08-31 16:54:08 +08:00

58 lines
1.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# workspace_upload.dspy - 上传文件到工作空间目录base64 JSON body
import os
import base64
folder_id = (params_kw or {}).get('id', '').strip()
filename = (params_kw or {}).get('filename', '').strip()
filedata = (params_kw or {}).get('filedata', '').strip()
uid = await get_user()
if not uid:
uid = 'user-01'
session_id = (params_kw or {}).get('session_id', '') or ''
pipeline_id = (params_kw or {}).get('pipeline_id', '') or ''
dbname = get_module_dbname('pipeline-sdlc')
async with DBPools().sqlorContext(dbname) as sor:
# 产线隔离:跨产线项目视为无项目(与弹窗入口一致,防绕过)
project_dir, _ = await get_project_dir_pl(sor, uid, session_id, pipeline_id)
space_dir, _ = await get_space_dir(sor, uid, session_id)
if not project_dir or not os.path.isdir(project_dir):
return {"status": "error", "message": "项目目录不可用"}
target_dir = resolve_workspace_path(project_dir, space_dir, folder_id)
if not os.path.isdir(target_dir):
return {"status": "error", "message": "目标目录不存在: " + folder_id}
# 防止路径穿越
filename = os.path.basename(filename)
if not filename:
return {"status": "error", "message": "文件名无效"}
if not filedata:
return {"status": "error", "message": "文件内容为空"}
# 解码 base64
try:
if filedata.startswith('data:'):
_, b64 = filedata.split(',', 1)
else:
b64 = filedata
data = base64.b64decode(b64)
except Exception as e:
return {"status": "error", "message": "文件解码失败: " + str(e)}
target_path = os.path.join(target_dir, filename)
try:
with open(target_path, 'wb') as f:
f.write(data)
except Exception as e:
return {"status": "error", "message": "写入失败: " + str(e)}
return {"status": "ok", "message": "上传成功: " + filename}