pipeline-sdlc/wwwroot/api/workspace_upload.dspy
ymq 524abb23e6 feat(workspace): 工作空间端点按会话解析项目(session_id)
- workspace_popup/tree/files/view/open/delete/upload/file + office_read/save 读 session_id 传 get_workspace_dir
- 内部 URL 链路(查看/编辑/删除/上传/文件/vi编辑/univer-office)透传 session_id
- workspace_edit.xterm 手写项目解析收敛到 get_workspace_dir(session_id)
2026-08-24 16:40:49 +08:00

58 lines
1.6 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 ''
dbname = get_module_dbname('pipeline-sdlc')
async with DBPools().sqlorContext(dbname) as sor:
ws_dir, _ = await get_workspace_dir(sor, uid, session_id)
if not ws_dir or not os.path.isdir(ws_dir):
return {"status": "error", "message": "工作空间目录不可用"}
if not folder_id or folder_id == '__root__':
target_dir = ws_dir
else:
target_dir = ws_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}