上传入库流程
公开教程 · 无需登录

上传入库流程

仅教师角色可发起上传。系统先校验扩展名与文件大小,通过后方可写入文件,随后将材料行与知识库正文置于同一事务提交。任一步骤失败,两张表整体回滚,已写入的文件亦须清理。

1上传与两表同一事务

接收 multipart 教师角色 白名单校验 .txt / .md · 大小上限 生成存储名 写入上传目录 事务写入两表 materials + knowledge 校验失败 → 4xx 不生成文件与数据记录 任一步骤失败:两张表回滚 并清理已写入文件 → 无残留 提交 → 201 两表与文件状态一致 孤儿文件与孤儿记录(orphan)均不允许存在;清理策略须写入规约方可验收
上传是一次事务性操作:磁盘写入与两表写入同生共死;任一步骤失败均回退至「无文件、无记录」的干净状态。

存储名由服务端生成,不使用客户端上传的原始文件名作为路径。成功时材料记录与正文同时存在;失败时二者均不留存。

2上传请求在各模块间如何衔接

浏览器仅负责将文件放入请求体。真正决定能否入库的,是后续三个模块按序接手处理。学生请求在第二步即被拒绝,此时磁盘与数据库尚未发生任何写入。

浏览器 提交文件和标题 Nginx 原样反向代理至 Go 认证模块 先校验登录状态 再校验教师角色 学生请求在此返回 403 上传模块 白名单校验通过后落盘 班级取自会话,而非表单 两表在同一事务中提交 本课止于正文入库。切分、向量嵌入与写入向量库属于第 4 课的检索模块,不在本次上传事务范围内。 事务失败时:两张表回滚,已写入文件一并删除,不产生「有文件无记录」的残留状态。
写入材料行与知识库正文时,班级编号取自会话中的值。表单中另行携带的班级字段,不会改变实际入库的班级。